annotate dmd/attrib.c @ 723:55f6c2e454d7

Implemented correct parameter order according to x86-32 ABI documentation. Changed AA types to just a void* .
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sat, 25 Oct 2008 06:03:28 +0200
parents b654bb98d31d
children 041c1596d217
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
2 // Compiler implementation of the D programming language
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
3 // Copyright (c) 1999-2008 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
11 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
12 #include <stdlib.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
13 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
14
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
15 #if _WIN32 || IN_GCC || IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
16 #include "mem.h"
571
cbd6c8073a32 Changed all '#if linux || __APPLE__' to '#if POSIX' so we can support other platforms too, thanx for the suggestion anders.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 535
diff changeset
17 #elif POSIX
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
18 #include "../root/mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
19 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
20
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
21 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
22 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
23 #include "attrib.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
24 #include "cond.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
25 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
26 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
27 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
28 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
29 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
30 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
31 #include "parse.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
32 #include "template.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
33
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
34 #include "../gen/enums.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
35 #include "../gen/logger.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
36
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
37 extern void obj_includelib(const char *name);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
38 void obj_startaddress(Symbol *s);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
39
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
40
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
41 /********************************* AttribDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
42
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
43 AttribDeclaration::AttribDeclaration(Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
44 : Dsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
45 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
46 this->decl = decl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
47 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
48
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
49 Array *AttribDeclaration::include(Scope *sc, ScopeDsymbol *sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
50 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
51 return decl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
52 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
53
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
54 int AttribDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
55 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
56 int m = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
57 Array *d = include(sc, sd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
58
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
59 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
60 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
61 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
62 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
63 m |= s->addMember(sc, sd, m | memnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
64 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
65 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
66 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
67 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
68
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
69 void AttribDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
70 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
71 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
72
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
73 //printf("\tAttribDeclaration::semantic '%s', d = %p\n",toChars(), d);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
74 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
75 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
76 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
77 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
78 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
79
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
80 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
81 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
82 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
83 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
84
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
85 void AttribDeclaration::semantic2(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
86 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
87 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
88
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
89 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
90 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
91 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
92 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
93 s->semantic2(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
94 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
95 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
96 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
97
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
98 void AttribDeclaration::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
99 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
100 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
101
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
102 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
103 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
104 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
105 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
106 s->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
107 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
108 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
109 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
110
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
111 void AttribDeclaration::inlineScan()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
112 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
113 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
114
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
115 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
116 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
117 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
118 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
119 //printf("AttribDeclaration::inlineScan %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
120 s->inlineScan();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
121 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
122 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
123 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
124
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
125 void AttribDeclaration::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
126 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
127 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
128 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
129 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
130
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
131 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
132 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
133 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
134 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
135 //printf("AttribDeclaration::addComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
136 s->addComment(comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
137 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
138 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
139 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
140 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
141
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
142 void AttribDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
143 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
144 //printf("AttribDeclaration::emitComment(sc = %p)\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
145
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
146 /* If generating doc comment, skip this because if we're inside
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
147 * a template, then include(NULL, NULL) will fail.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
148 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
149 // if (sc->docbuf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
150 // return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
151
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
152 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
153
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
154 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
155 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
156 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
157 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
158 //printf("AttribDeclaration::emitComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
159 s->emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
160 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
161 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
162 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
163
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
164 void AttribDeclaration::toObjFile(int multiobj)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
165 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
166 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
167
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
168 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
169 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
170 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
171 { Dsymbol *s = (Dsymbol *)d->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
172 s->toObjFile(multiobj);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
173 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
174 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
175 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
176
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
177 int AttribDeclaration::cvMember(unsigned char *p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
178 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
179 int nwritten = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
180 int n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
181 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
182
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
183 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
184 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
185 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
186 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
187 n = s->cvMember(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
188 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
189 p += n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
190 nwritten += n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
191 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
192 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
193 return nwritten;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
194 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
195
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
196 int AttribDeclaration::hasPointers()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
197 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
198 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
199
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
200 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
201 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
202 for (size_t i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
203 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
204 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
205 if (s->hasPointers())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
206 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
207 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
208 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
209 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
210 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
211
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
212 const char *AttribDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
213 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
214 return "attribute";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
215 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
216
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
217 int AttribDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
218 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
219 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
220
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
221 return Dsymbol::oneMembers(d, ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
222 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
223
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
224 void AttribDeclaration::checkCtorConstInit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
225 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
226 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
227
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
228 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
229 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
230 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
231 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
232 s->checkCtorConstInit();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
233 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
234 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
235 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
236
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
237 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
238 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
239
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
240 void AttribDeclaration::addLocalClass(ClassDeclarations *aclasses)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
241 {
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
242 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
243
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
244 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
245 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
246 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
247 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
248 s->addLocalClass(aclasses);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
249 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
250 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
251 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
252
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
253
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
254 void AttribDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
255 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
256 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
257 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
258 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
259 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
260 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
261 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
262 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
263 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
264
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
265 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
266 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
267 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
268 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
269 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
270 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
271 buf->writeByte(';');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
272 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
273 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
275 /************************* StorageClassDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
276
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
277 StorageClassDeclaration::StorageClassDeclaration(unsigned stc, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
278 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
279 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
280 this->stc = stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
281 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
282
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
283 Dsymbol *StorageClassDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
284 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
285 StorageClassDeclaration *scd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
286
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
287 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
288 scd = new StorageClassDeclaration(stc, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
289 return scd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
290 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
291
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
292 void StorageClassDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
293 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
294 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
295 { unsigned stc_save = sc->stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
296
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
297 if (stc & (STCauto | STCscope | STCstatic | STCextern))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
298 sc->stc &= ~(STCauto | STCscope | STCstatic | STCextern);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
299 sc->stc |= stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
300 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
301 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
302 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
303
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
304 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
305 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
306 sc->stc = stc_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
307 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
308 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
309 sc->stc = stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
310 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
311
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
312 void StorageClassDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
313 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
314 struct SCstring
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
315 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
316 int stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
317 enum TOK tok;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
318 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
319
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
320 static SCstring table[] =
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
321 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
322 { STCauto, TOKauto },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
323 { STCscope, TOKscope },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
324 { STCstatic, TOKstatic },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
325 { STCextern, TOKextern },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
326 { STCconst, TOKconst },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
327 { STCfinal, TOKfinal },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
328 { STCabstract, TOKabstract },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
329 { STCsynchronized, TOKsynchronized },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
330 { STCdeprecated, TOKdeprecated },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
331 { STCoverride, TOKoverride },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
332 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
333
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
334 int written = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
335 for (int i = 0; i < sizeof(table)/sizeof(table[0]); i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
336 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
337 if (stc & table[i].stc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
338 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
339 if (written)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
340 buf->writeByte(' ');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
341 written = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
342 buf->writestring(Token::toChars(table[i].tok));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
343 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
344 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
345
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
346 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
347 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
348
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
349 /********************************* LinkDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
350
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
351 LinkDeclaration::LinkDeclaration(enum LINK p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
352 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
353 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
354 //printf("LinkDeclaration(linkage = %d, decl = %p)\n", p, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
355 linkage = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
356 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
357
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
358 Dsymbol *LinkDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
359 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
360 LinkDeclaration *ld;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
361
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
362 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
363 ld = new LinkDeclaration(linkage, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
364 return ld;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
365 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
366
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
367 void LinkDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
368 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
369 //printf("LinkDeclaration::semantic(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
370 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
371 { enum LINK linkage_save = sc->linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
372
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
373 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
374 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
375 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
376 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
377
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
378 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
379 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
380 sc->linkage = linkage_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
381 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
382 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
383 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
384 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
385 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
386 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
387
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
388 void LinkDeclaration::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
389 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
390 //printf("LinkDeclaration::semantic3(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
391 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
392 { enum LINK linkage_save = sc->linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
393
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
394 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
395 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
396 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
397 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
398
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
399 s->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
400 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
401 sc->linkage = linkage_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
402 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
403 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
404 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
405 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
406 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
407 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
408
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
409 void LinkDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
410 { char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
411
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
412 switch (linkage)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
413 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
414 case LINKd: p = "D"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
415 case LINKc: p = "C"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
416 case LINKcpp: p = "C++"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
417 case LINKwindows: p = "Windows"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
418 case LINKpascal: p = "Pascal"; break;
723
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
419
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
420 // LDC
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
421 case LINKintrinsic: p = "Intrinsic"; break;
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
422
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
423 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
424 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
425 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
426 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
427 buf->writestring("extern (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
428 buf->writestring(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
429 buf->writestring(") ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
430 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
431 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
432
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
433 char *LinkDeclaration::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
434 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
435 return "extern ()";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
436 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
437
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
438 /********************************* ProtDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
439
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
440 ProtDeclaration::ProtDeclaration(enum PROT p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
441 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
442 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
443 protection = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
444 //printf("decl = %p\n", decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
445 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
446
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
447 Dsymbol *ProtDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
448 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
449 ProtDeclaration *pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
450
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
451 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
452 pd = new ProtDeclaration(protection, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
453 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
454 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
455
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
456 void ProtDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
457 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
458 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
459 { enum PROT protection_save = sc->protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
460 int explicitProtection_save = sc->explicitProtection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
461
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
462 sc->protection = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
463 sc->explicitProtection = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
464 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
465 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
466 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
467
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
468 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
469 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
470 sc->protection = protection_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
471 sc->explicitProtection = explicitProtection_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
472 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
473 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
474 { sc->protection = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
475 sc->explicitProtection = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
476 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
477 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
478
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
479 void ProtDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
480 { char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
481
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
482 switch (protection)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
483 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
484 case PROTprivate: p = "private"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
485 case PROTpackage: p = "package"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
486 case PROTprotected: p = "protected"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
487 case PROTpublic: p = "public"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
488 case PROTexport: p = "export"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
489 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
490 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
491 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
492 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
493 buf->writestring(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
494 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
495 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
496
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
497 /********************************* AlignDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
498
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
499 AlignDeclaration::AlignDeclaration(Loc loc, unsigned sa, Array *decl)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
500 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
501 {
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
502 this->loc = loc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
503 salign = sa;
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
504
716
b654bb98d31d Turned unimplemented align error into a warning instead.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 710
diff changeset
505 if (global.params.warnings && salign != 1)
b654bb98d31d Turned unimplemented align error into a warning instead.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 710
diff changeset
506 warning("%s: align(%d) is not implemented and specified to be unportable anyway, use align(1) and manual fillers instead", loc.toChars(), salign);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
507 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
508
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
509 Dsymbol *AlignDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
510 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
511 AlignDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
512
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
513 assert(!s);
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
514 ad = new AlignDeclaration(loc, salign, Dsymbol::arraySyntaxCopy(decl));
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
515 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
516 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
517
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
518 void AlignDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
519 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
520 //printf("\tAlignDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
521 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
522 { unsigned salign_save = sc->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
523
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
524 sc->structalign = salign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
525 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
526 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
527 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
528
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
529 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
530 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
531 sc->structalign = salign_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
532 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
533 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
534 sc->structalign = salign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
535 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
536
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
537
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
538 void AlignDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
539 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
540 buf->printf("align (%d)", salign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
541 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
542 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
543
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
544 /********************************* AnonDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
545
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
546 AnonDeclaration::AnonDeclaration(Loc loc, int isunion, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
547 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
548 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
549 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
550 this->isunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
551 this->scope = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
552 this->sem = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
553 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
554
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
555 Dsymbol *AnonDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
556 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
557 AnonDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
558
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
559 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
560 ad = new AnonDeclaration(loc, isunion, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
561 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
562 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
563
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
564 void AnonDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
565 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
566 //printf("\tAnonDeclaration::semantic %s %p\n", isunion ? "union" : "struct", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
567
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
568 Scope *scx = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
569 if (scope)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
570 { sc = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
571 scx = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
572 scope = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
573 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
574
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
575 assert(sc->parent);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
576
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
577 Dsymbol *parent = sc->parent->pastMixin();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
578 AggregateDeclaration *ad = parent->isAggregateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
579
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
580 if (!ad || (!ad->isStructDeclaration() && !ad->isClassDeclaration()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
581 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
582 error("can only be a part of an aggregate");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
583 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
584 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
585
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
586 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
587 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
588 AnonymousAggregateDeclaration aad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
589 int adisunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
590
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
591 if (sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
592 { ad = sc->anonAgg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
593 adisunion = sc->inunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
594 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
595 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
596 adisunion = ad->isUnionDeclaration() != NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
597
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
598 // printf("\tsc->anonAgg = %p\n", sc->anonAgg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
599 // printf("\tad = %p\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
600 // printf("\taad = %p\n", &aad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
601
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
602 sc = sc->push();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
603 sc->anonAgg = &aad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
604 sc->stc &= ~(STCauto | STCscope | STCstatic);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
605 sc->inunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
606 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
607 sc->flags = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
608 aad.structalign = sc->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
609 aad.parent = ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
610
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
611 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
612 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
613 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
614
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
615 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
616 if (isunion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
617 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
618 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
619 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
620 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
621 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
622 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
623 sc = sc->pop();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
624
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
625 // If failed due to forward references, unwind and try again later
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
626 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
627 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
628 ad->sizeok = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
629 //printf("\tsetting ad->sizeok %p to 2\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
630 if (!sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
631 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
632 scope = scx ? scx : new Scope(*sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
633 scope->setNoFree();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
634 scope->module->addDeferredSemantic(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
635 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
636 //printf("\tforward reference %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
637 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
638 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
639 if (sem == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
640 { Module::dprogress++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
641 sem = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
642 //printf("\tcompleted %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
643 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
644 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
645 ;//printf("\talready completed %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
646
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
647 // 0 sized structs are set to 1 byte
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
648 if (aad.structsize == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
649 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
650 aad.structsize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
651 aad.alignsize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
652 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
653
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
654 // Align size of anonymous aggregate
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
655 //printf("aad.structalign = %d, aad.alignsize = %d, sc->offset = %d\n", aad.structalign, aad.alignsize, sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
656 ad->alignmember(aad.structalign, aad.alignsize, &sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
657 //ad->structsize = sc->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
658 //printf("sc->offset = %d\n", sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
659
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
660 // Add members of aad to ad
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
661 //printf("\tadding members of aad to '%s'\n", ad->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
662 for (unsigned i = 0; i < aad.fields.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
663 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
664 VarDeclaration *v = (VarDeclaration *)aad.fields.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
665
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
666 v->offset += sc->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
667 ad->fields.push(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
668 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
669
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
670 // Add size of aad to ad
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
671 if (adisunion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
672 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
673 if (aad.structsize > ad->structsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
674 ad->structsize = aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
675 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
676 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
677 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
678 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
679 ad->structsize = sc->offset + aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
680 sc->offset = ad->structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
681 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
682
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
683 if (ad->alignsize < aad.alignsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
684 ad->alignsize = aad.alignsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
685 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
686 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
687
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
688
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
689 void AnonDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
690 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
691 buf->printf(isunion ? "union" : "struct");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
692 buf->writestring("\n{\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
693 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
694 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
695 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
696 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
697 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
698
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
699 //buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
700 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
701 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
702 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
703 buf->writestring("}\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
704 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
705
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
706 const char *AnonDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
707 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
708 return (char *)(isunion ? "anonymous union" : "anonymous struct");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
709 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
710
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
711 /********************************* PragmaDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
712
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
713 static bool parseStringExp(Expression* e, std::string& res)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
714 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
715 StringExp *s = NULL;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
716
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
717 e = e->optimize(WANTvalue);
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
718 if (e->op == TOKstring && (s = (StringExp *)e))
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
719 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
720 char* str = (char*)s->string;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
721 res = str;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
722 return true;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
723 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
724 return false;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
725 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
726
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
727 PragmaDeclaration::PragmaDeclaration(Loc loc, Identifier *ident, Expressions *args, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
728 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
729 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
730 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
731 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
732 this->args = args;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
733 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
734
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
735 Dsymbol *PragmaDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
736 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
737 PragmaDeclaration *pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
738
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
739 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
740 pd = new PragmaDeclaration(loc, ident,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
741 Expression::arraySyntaxCopy(args), Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
742 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
743 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
744
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
745 void PragmaDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
746 { // Should be merged with PragmaStatement
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
747
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
748 #if IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
749 int llvm_internal = 0;
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
750 std::string arg1str;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
751
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
752 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
753
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
754 //printf("\tPragmaDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
755 if (ident == Id::msg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
756 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
757 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
758 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
759 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
760 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
761 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
762
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
763 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
764 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
765 if (e->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
766 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
767 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
768 fprintf(stdmsg, "%.*s", (int)se->len, se->string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
769 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
770 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
771 error("string expected for message, not '%s'", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
772 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
773 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
774 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
775 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
776 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
777 else if (ident == Id::lib)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
778 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
779 if (!args || args->dim != 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
780 error("string expected for library name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
781 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
782 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
783 Expression *e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
784
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
785 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
786 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
787 args->data[0] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
788 if (e->op != TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
789 error("string expected for library name, not '%s'", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
790 else if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
791 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
792 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
793 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
794 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
795 name[se->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
796 printf("library %s\n", name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
797 mem.free(name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
798 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
799 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
800 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
801 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
802 #if IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
803 else if (ident == Id::GNU_asm)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
804 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
805 if (! args || args->dim != 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
806 error("identifier and string expected for asm name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
807 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
808 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
809 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
810 Declaration *d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
811 StringExp *s = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
812
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
813 e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
814 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
815 if (e->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
816 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
817 d = ((VarExp *)e)->var;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
818 if (! d->isFuncDeclaration() && ! d->isVarDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
819 d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
820 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
821 if (!d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
822 error("first argument of GNU_asm must be a function or variable declaration");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
823
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
824 e = (Expression *)args->data[1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
825 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
826 e = e->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
827 if (e->op == TOKstring && ((StringExp *)e)->sz == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
828 s = ((StringExp *)e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
829 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
830 error("second argument of GNU_asm must be a char string");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
831
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
832 if (d && s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
833 d->c_ident = Lexer::idPool((char*) s->string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
834 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
835 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
836 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
837 #endif
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
838
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
839 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
840 #if IN_LLVM
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
841
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
842 // pragma(intrinsic, "string") { funcdecl(s) }
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
843 else if (ident == Id::intrinsic)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
844 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
845 Expression* expr = (Expression *)args->data[0];
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
846 expr = expr->semantic(sc);
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
847 if (!args || args->dim != 1 || !parseStringExp(expr, arg1str))
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
848 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
849 error("requires exactly 1 string literal parameter");
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
850 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
851 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
852 llvm_internal = LLVMintrinsic;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
853 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
854
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
855 // pragma(notypeinfo) { typedecl(s) }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
856 else if (ident == Id::no_typeinfo)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
857 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
858 if (args && args->dim > 0)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
859 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
860 error("takes no parameters");
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
861 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
862 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
863 llvm_internal = LLVMno_typeinfo;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
864 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
865
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
866 // pragma(nomoduleinfo) ;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
867 else if (ident == Id::no_moduleinfo)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
868 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
869 if (args && args->dim > 0)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
870 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
871 error("takes no parameters");
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
872 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
873 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
874 llvm_internal = LLVMno_moduleinfo;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
875 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
876
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
877 // pragma(alloca) { funcdecl(s) }
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
878 else if (ident == Id::Alloca)
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
879 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
880 if (args && args->dim > 0)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
881 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
882 error("takes no parameters");
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
883 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
884 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
885 llvm_internal = LLVMalloca;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
886 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
887
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
888 // pragma(va_start) { templdecl(s) }
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
889 else if (ident == Id::vastart)
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
890 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
891 if (args && args->dim > 0)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
892 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
893 error("takes no parameters");
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
894 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
895 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
896 llvm_internal = LLVMva_start;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
897 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
898
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
899 // pragma(va_copy) { funcdecl(s) }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
900 else if (ident == Id::vacopy)
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
901 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
902 if (args && args->dim > 0)
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
903 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
904 error("takes no parameters");
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
905 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
906 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
907 llvm_internal = LLVMva_copy;
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
908 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
909
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
910 // pragma(va_end) { funcdecl(s) }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
911 else if (ident == Id::vaend)
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
912 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
913 if (args && args->dim > 0)
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
914 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
915 error("takes no parameters");
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
916 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
917 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
918 llvm_internal = LLVMva_end;
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
919 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
920
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
921 // pragma(va_arg) { templdecl(s) }
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
922 else if (ident == Id::vaarg)
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
923 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
924 if (args && args->dim > 0)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
925 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
926 error("takes no parameters");
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
927 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
928 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
929 llvm_internal = LLVMva_arg;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
930 }
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
931
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
932 // pragma(ldc, "string") { templdecl(s) }
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
933 else if (ident == Id::ldc)
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
934 {
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
935 Expression* expr = (Expression *)args->data[0];
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
936 expr = expr->semantic(sc);
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
937 if (!args || args->dim != 1 || !parseStringExp(expr, arg1str))
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
938 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
939 error("requires exactly 1 string literal parameter");
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
940 fatal();
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
941 }
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
942 else if (arg1str == "verbose")
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
943 {
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
944 sc->module->llvmForceLogging = true;
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
945 }
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
946 else
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
947 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
948 error("command '%s' invalid");
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
949 fatal();
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
950 }
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 445
diff changeset
951 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
952
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
953 #endif // LDC
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
954
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
955 else if (global.params.ignoreUnsupportedPragmas)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
956 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
957 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
958 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
959 /* Print unrecognized pragmas
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
960 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
961 printf("pragma %s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
962 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
963 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
964 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
965 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
966 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
967 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
968 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
969 if (i == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
970 printf(" (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
971 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
972 printf(",");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
973 printf("%s", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
974 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
975 if (args->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
976 printf(")");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
977 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
978 printf("\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
979 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
980 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
981 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
982 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
983 error("unrecognized pragma(%s)", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
984
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
985 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
986 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
987 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
988 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
989 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
990
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
991 s->semantic(sc);
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
992
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
993 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
994 #if IN_LLVM
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
995
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
996 if (llvm_internal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
997 {
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
998 if (s->llvmInternal)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
999 {
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1000 error("multiple LDC specific pragmas not allowed not affect the same declaration ('%s' at '%s')", s->toChars(), s->loc.toChars());
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1001 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1002 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1003 switch(llvm_internal)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1004 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1005 case LLVMintrinsic:
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1006 if (FuncDeclaration* fd = s->isFuncDeclaration())
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1007 {
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1008 fd->llvmInternal = llvm_internal;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1009 fd->intrinsicName = arg1str;
723
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
1010 fd->linkage = LINKintrinsic;
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
1011 ((TypeFunction*)fd->type)->linkage = LINKintrinsic;
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1012 }
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1013 else if (TemplateDeclaration* td = s->isTemplateDeclaration())
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1014 {
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1015 td->llvmInternal = llvm_internal;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1016 td->intrinsicName = arg1str;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1017 }
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1018 else
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1019 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1020 error("only allowed on function declarations");
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1021 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1022 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1023 break;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1024
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1025 case LLVMva_start:
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1026 case LLVMva_arg:
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1027 if (TemplateDeclaration* td = s->isTemplateDeclaration())
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1028 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1029 if (td->parameters->dim != 1)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1030 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1031 error("the '%s' pragma template must have exactly one template parameter", ident->toChars());
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1032 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1033 }
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1034 else if (!td->onemember)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1035 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1036 error("the '%s' pragma template must have exactly one member", ident->toChars());
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1037 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1038 }
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1039 else if (td->overnext || td->overroot)
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1040 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1041 error("the '%s' pragma template must not be overloaded", ident->toChars());
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1042 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1043 }
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1044 td->llvmInternal = llvm_internal;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1045 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1046 else
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1047 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1048 error("the '%s' pragma is only allowed on template declarations", ident->toChars());
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1049 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1050 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1051 break;
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1052
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1053 case LLVMva_copy:
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1054 case LLVMva_end:
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1055 if (FuncDeclaration* fd = s->isFuncDeclaration())
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1056 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1057 fd->llvmInternal = llvm_internal;
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1058 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1059 else
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1060 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1061 error("the '%s' pragma is only allowed on function declarations", ident->toChars());
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1062 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1063 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1064 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1065
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1066 case LLVMno_typeinfo:
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1067 s->llvmInternal = llvm_internal;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1068 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1069
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1070 case LLVMalloca:
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1071 if (FuncDeclaration* fd = s->isFuncDeclaration())
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1072 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1073 fd->llvmInternal = llvm_internal;
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1074 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1075 else
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1076 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1077 error("the '%s' pragma must only be used on function declarations of type 'void* function(uint nbytes)'", ident->toChars());
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1078 fatal();
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1079 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1080 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1081
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1082 default:
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1083 warning("the LDC specific pragma '%s' is not yet implemented, ignoring", ident->toChars());
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1084 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1085 }
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1086
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1087 #endif // LDC
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1088
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1089 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1090 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1091 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1092
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1093 Lnodecl:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1094 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1095 error("pragma is missing closing ';'");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1096 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1097
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1098 int PragmaDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1099 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1100 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1101 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1102 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1103
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1104 const char *PragmaDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1105 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1106 return "pragma";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1107 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1108
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1109 void PragmaDeclaration::toObjFile(int multiobj)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1110 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1111 if (ident == Id::lib)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1112 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1113 assert(args && args->dim == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1114
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1115 Expression *e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1116
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1117 assert(e->op == TOKstring);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1118
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1119 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1120 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1121 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1122 name[se->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1123 obj_includelib(name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1124 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1125 AttribDeclaration::toObjFile(multiobj);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1126 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1127
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1128 void PragmaDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1129 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1130 buf->printf("pragma(%s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1131 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1132 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1133 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1134 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1135 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1136
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1137 buf->writestring(", ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1138 e->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1139 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1140 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1141 buf->writestring(")");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1142 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1143 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1144
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1145
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1146 /********************************* ConditionalDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1147
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1148 ConditionalDeclaration::ConditionalDeclaration(Condition *condition, Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1149 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1150 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1151 //printf("ConditionalDeclaration::ConditionalDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1152 this->condition = condition;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1153 this->elsedecl = elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1154 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1155
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1156 Dsymbol *ConditionalDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1157 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1158 ConditionalDeclaration *dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1160 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1161 dd = new ConditionalDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1162 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1163 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1164 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1165 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1166
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1167
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1168 int ConditionalDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1169 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1170 //printf("ConditionalDeclaration::oneMember(), inc = %d\n", condition->inc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1171 if (condition->inc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1172 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1173 Array *d = condition->include(NULL, NULL) ? decl : elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1174 return Dsymbol::oneMembers(d, ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1175 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1176 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1177 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1178 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1179
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1180 void ConditionalDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1181 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1182 //printf("ConditionalDeclaration::emitComment(sc = %p)\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1183 if (condition->inc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1184 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1185 AttribDeclaration::emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1186 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1187 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1188
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1189 // Decide if 'then' or 'else' code should be included
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1190
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1191 Array *ConditionalDeclaration::include(Scope *sc, ScopeDsymbol *sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1192 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1193 //printf("ConditionalDeclaration::include()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1194 assert(condition);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1195 return condition->include(sc, sd) ? decl : elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1196 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1197
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1198
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1199 void ConditionalDeclaration::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1200 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1201 /* Because addComment is called by the parser, if we called
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1202 * include() it would define a version before it was used.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1203 * But it's no problem to drill down to both decl and elsedecl,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1204 * so that's the workaround.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1205 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1206
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1207 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1208 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1209 Array *d = decl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1210
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1211 for (int j = 0; j < 2; j++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1212 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1213 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1214 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1215 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1216 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1217
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1218 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1219 //printf("ConditionalDeclaration::addComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1220 s->addComment(comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1221 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1222 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1223 d = elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1224 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1225 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1226 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1227
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1228 void ConditionalDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1229 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1230 condition->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1231 if (decl || elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1232 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1233 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1234 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1235 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1236 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1237 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1238 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1239 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1240 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1241
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1242 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1243 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1244 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1245 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1246 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1247 if (elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1248 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1249 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1250 buf->writestring("else");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1251 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1252 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1253 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1254 for (unsigned i = 0; i < elsedecl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1255 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1256 Dsymbol *s = (Dsymbol *)elsedecl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1257
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1258 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1259 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1260 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1261 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1262 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1263 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1264 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1265 buf->writeByte(':');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1266 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1267 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1268
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1269 /***************************** StaticIfDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1270
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1271 StaticIfDeclaration::StaticIfDeclaration(Condition *condition,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1272 Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1273 : ConditionalDeclaration(condition, decl, elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1274 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1275 //printf("StaticIfDeclaration::StaticIfDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1276 sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1277 addisdone = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1278 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1279
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1280
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1281 Dsymbol *StaticIfDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1282 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1283 StaticIfDeclaration *dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1284
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1285 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1286 dd = new StaticIfDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1287 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1288 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1289 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1290 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1291
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1292
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1293 int StaticIfDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1294 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1295 //printf("StaticIfDeclaration::addMember() '%s'\n",toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1296 /* This is deferred until semantic(), so that
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1297 * expressions in the condition can refer to declarations
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1298 * in the same scope, such as:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1299 *
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1300 * template Foo(int i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1301 * {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1302 * const int j = i + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1303 * static if (j == 3)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1304 * const int k;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1305 * }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1306 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1307 this->sd = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1308 int m = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1309
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1310 if (memnum == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1311 { m = AttribDeclaration::addMember(sc, sd, memnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1312 addisdone = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1313 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1314 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1315 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1316
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1317
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1318 void StaticIfDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1319 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1320 Array *d = include(sc, sd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1321
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1322 //printf("\tStaticIfDeclaration::semantic '%s', d = %p\n",toChars(), d);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1323 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1324 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1325 if (!addisdone)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1326 { AttribDeclaration::addMember(sc, sd, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1327 addisdone = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1328 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1329
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1330 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1331 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1332 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1333
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1334 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1335 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1336 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1337 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1338
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1339 const char *StaticIfDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1340 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1341 return "static if";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1342 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1343
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1344
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1345 /***************************** CompileDeclaration *****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1346
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1347 CompileDeclaration::CompileDeclaration(Loc loc, Expression *exp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1348 : AttribDeclaration(NULL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1349 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1350 this->loc = loc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1351 this->exp = exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1352 this->sd = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1353 this->compiled = 0;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1354 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1355
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1356 Dsymbol *CompileDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1357 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1358 //printf("CompileDeclaration::syntaxCopy('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1359 CompileDeclaration *sc = new CompileDeclaration(loc, exp->syntaxCopy());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1360 return sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1361 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1362
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1363 int CompileDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1364 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1365 //printf("CompileDeclaration::addMember(sc = %p)\n", sc);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1366 this->sd = sd;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1367 if (memnum == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1368 { /* No members yet, so parse the mixin now
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1369 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1370 compileIt(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1371 memnum |= AttribDeclaration::addMember(sc, sd, memnum);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1372 compiled = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1373 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1374 return memnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1375 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1376
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1377 void CompileDeclaration::compileIt(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1378 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1379 //printf("CompileDeclaration::compileIt()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1380 exp = exp->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1381 exp = resolveProperties(sc, exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1382 exp = exp->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1383 if (exp->op != TOKstring)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1384 { exp->error("argument to mixin must be a string, not (%s)", exp->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1385 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1386 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1387 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1388 StringExp *se = (StringExp *)exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1389 se = se->toUTF8(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1390 Parser p(sc->module, (unsigned char *)se->string, se->len, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1391 p.loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1392 p.nextToken();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1393 decl = p.parseDeclDefs(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1394 if (p.token.value != TOKeof)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1395 exp->error("incomplete mixin declaration (%s)", se->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1396 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1397 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1398
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1399 void CompileDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1400 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1401 //printf("CompileDeclaration::semantic()\n");
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1402
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1403 if (!compiled)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1404 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1405 compileIt(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1406 AttribDeclaration::addMember(sc, sd, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1407 compiled = 1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1408 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1409 AttribDeclaration::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1410 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1411
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1412 void CompileDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1413 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1414 buf->writestring("mixin(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1415 exp->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1416 buf->writestring(");");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1417 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1418 }