annotate dmd/attrib.c @ 1351:8d501abecd24

Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
author Tomas Lindquist Olsen <tomas.l.olsen gmail com>
date Thu, 14 May 2009 17:20:17 +0200
parents e961851fb8be
children 229e02867307
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
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
3 // Copyright (c) 1999-2009 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
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
15 #include "rmem.h"
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
16
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
17 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
18 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
19 #include "attrib.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
20 #include "cond.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
21 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
22 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
23 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
24 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
25 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
26 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
27 #include "parse.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
28 #include "template.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
29
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
30 #if IN_LLVM
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
31 #include "../gen/enums.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
32
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
33 #include "llvm/Support/CommandLine.h"
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
34
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
35 static llvm::cl::opt<bool> ignoreUnsupportedPragmas("ignore",
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
36 llvm::cl::desc("Ignore unsupported pragmas"),
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
37 llvm::cl::ZeroOrMore);
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
38
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
39 #endif
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
40
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
41
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
42 extern void obj_includelib(const char *name);
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
43
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
44 #if IN_DMD
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
45 void obj_startaddress(Symbol *s);
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
46 #endif
159
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 /********************************* AttribDeclaration ****************************/
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 AttribDeclaration::AttribDeclaration(Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
52 : Dsymbol()
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 this->decl = decl;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
57 Array *AttribDeclaration::include(Scope *sc, ScopeDsymbol *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 return decl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
60 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
61
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
62 int AttribDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
63 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
64 int m = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
65 Array *d = include(sc, sd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
66
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
67 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
68 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
69 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
70 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
71 m |= s->addMember(sc, sd, m | memnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
72 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
73 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
74 return m;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
77 void AttribDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
78 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
79 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
80
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
81 //printf("\tAttribDeclaration::semantic '%s', d = %p\n",toChars(), d);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
82 if (d)
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 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
85 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
86 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
87
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
88 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
89 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
90 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
91 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
92
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
93 void AttribDeclaration::semantic2(Scope *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 Array *d = include(sc, NULL);
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 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
98 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
99 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
100 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
101 s->semantic2(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
102 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
103 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
104 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
105
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
106 void AttribDeclaration::semantic3(Scope *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 Array *d = include(sc, NULL);
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 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
111 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
112 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
113 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
114 s->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
115 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
116 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
117 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
118
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
119 void AttribDeclaration::inlineScan()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
120 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
121 Array *d = include(NULL, NULL);
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 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
124 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
125 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
126 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
127 //printf("AttribDeclaration::inlineScan %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
128 s->inlineScan();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
129 }
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
132
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
133 void AttribDeclaration::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
134 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
135 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
136 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
137 Array *d = include(NULL, NULL);
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 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
140 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
141 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
142 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
143 //printf("AttribDeclaration::addComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
144 s->addComment(comment);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
147 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
150 void AttribDeclaration::emitComment(Scope *sc)
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 //printf("AttribDeclaration::emitComment(sc = %p)\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
153
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
154 /* A general problem with this, illustrated by BUGZILLA 2516,
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
155 * is that attributes are not transmitted through to the underlying
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
156 * member declarations for template bodies, because semantic analysis
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
157 * is not done for template declaration bodies
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
158 * (only template instantiations).
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
159 * Hence, Ddoc omits attributes from template members.
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
160 */
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
161
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
162 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
163
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
164 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
165 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
166 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
167 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
168 //printf("AttribDeclaration::emitComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
169 s->emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
170 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
171 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
172 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
173
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
174 #if IN_DMD
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
175
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
176 void AttribDeclaration::toObjFile(int multiobj)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
177 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
178 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
179
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
180 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
181 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
182 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
183 { Dsymbol *s = (Dsymbol *)d->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
184 s->toObjFile(multiobj);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
185 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
186 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
187 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
188
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
189 int AttribDeclaration::cvMember(unsigned char *p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
190 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
191 int nwritten = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
192 int n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
193 Array *d = include(NULL, NULL);
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 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
196 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
197 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
198 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
199 n = s->cvMember(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
200 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
201 p += n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
202 nwritten += n;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
205 return nwritten;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
206 }
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
207 #endif
159
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 int AttribDeclaration::hasPointers()
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 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
212
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
213 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
214 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
215 for (size_t i = 0; i < d->dim; i++)
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 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
218 if (s->hasPointers())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
219 return 1;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
222 return 0;
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
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
225 const char *AttribDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
226 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
227 return "attribute";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
228 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
229
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
230 int AttribDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
231 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
232 Array *d = include(NULL, NULL);
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 return Dsymbol::oneMembers(d, ps);
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 void AttribDeclaration::checkCtorConstInit()
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 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
240
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
241 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
242 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
243 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
244 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
245 s->checkCtorConstInit();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
246 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
247 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
248 }
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 void AttribDeclaration::addLocalClass(ClassDeclarations *aclasses)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
254 {
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
255 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
256
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
257 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
258 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
259 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
260 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
261 s->addLocalClass(aclasses);
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 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
266
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
267 void AttribDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
268 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
269 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
270 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
271 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
272 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
273 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
274 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
275 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
276 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
277
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
278 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
279 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
280 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
281 buf->writeByte('}');
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
284 buf->writeByte(';');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
285 buf->writenl();
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
288 /************************* StorageClassDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
289
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
290 StorageClassDeclaration::StorageClassDeclaration(unsigned stc, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
291 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
292 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
293 this->stc = stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
294 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
295
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
296 Dsymbol *StorageClassDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
297 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
298 StorageClassDeclaration *scd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
299
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
300 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
301 scd = new StorageClassDeclaration(stc, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
302 return scd;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
305 void StorageClassDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
306 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
307 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
308 { unsigned stc_save = sc->stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
309
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
310 if (stc & (STCauto | STCscope | STCstatic | STCextern))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
311 sc->stc &= ~(STCauto | STCscope | STCstatic | STCextern);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
312 sc->stc |= stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
313 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
314 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
315 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
316
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
317 s->semantic(sc);
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 sc->stc = stc_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
320 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
321 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
322 sc->stc = stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
323 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
324
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
325 void StorageClassDeclaration::stcToCBuffer(OutBuffer *buf, int stc)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
326 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
327 struct SCstring
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
328 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
329 int stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
330 enum TOK tok;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
331 };
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 static SCstring table[] =
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
334 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
335 { STCauto, TOKauto },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
336 { STCscope, TOKscope },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
337 { STCstatic, TOKstatic },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
338 { STCextern, TOKextern },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
339 { STCconst, TOKconst },
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
340 // { STCinvariant, TOKimmutable },
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
341 // { STCshared, TOKshared },
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
342 { STCfinal, TOKfinal },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
343 { STCabstract, TOKabstract },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
344 { STCsynchronized, TOKsynchronized },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
345 { STCdeprecated, TOKdeprecated },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
346 { STCoverride, TOKoverride },
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
347 // { STCnothrow, TOKnothrow },
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
348 // { STCpure, TOKpure },
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
349 // { STCref, TOKref },
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
350 // { STCtls, TOKtls },
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
351 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
352
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
353 for (int i = 0; i < sizeof(table)/sizeof(table[0]); i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
354 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
355 if (stc & table[i].stc)
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 buf->writestring(Token::toChars(table[i].tok));
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
358 buf->writeByte(' ');
159
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 }
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
361 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
362
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
363 void StorageClassDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
364 {
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
365 stcToCBuffer(buf, stc);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
366 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
367 }
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 /********************************* LinkDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
370
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
371 LinkDeclaration::LinkDeclaration(enum LINK p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
372 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
373 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
374 //printf("LinkDeclaration(linkage = %d, decl = %p)\n", p, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
375 linkage = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
376 }
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 Dsymbol *LinkDeclaration::syntaxCopy(Dsymbol *s)
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 LinkDeclaration *ld;
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 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
383 ld = new LinkDeclaration(linkage, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
384 return ld;
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 void LinkDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
388 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
389 //printf("LinkDeclaration::semantic(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
390 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
391 { enum LINK linkage_save = sc->linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
392
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
393 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
394 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
395 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
396 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
397
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
398 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
399 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
400 sc->linkage = linkage_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
401 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
402 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
403 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
404 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
405 }
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 void LinkDeclaration::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
409 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
410 //printf("LinkDeclaration::semantic3(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
411 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
412 { enum LINK linkage_save = sc->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 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
415 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
416 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
417 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
418
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
419 s->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
420 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
421 sc->linkage = linkage_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
422 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
423 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
424 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
425 sc->linkage = linkage;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
428
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
429 void LinkDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
430 { const char *p;
159
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 switch (linkage)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
433 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
434 case LINKd: p = "D"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
435 case LINKc: p = "C"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
436 case LINKcpp: p = "C++"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
437 case LINKwindows: p = "Windows"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
438 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
439
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
440 // LDC
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
441 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
442
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
443 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
444 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
445 break;
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 buf->writestring("extern (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
448 buf->writestring(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
449 buf->writestring(") ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
450 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
451 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
452
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
453 char *LinkDeclaration::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
454 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
455 return (char *)"extern ()";
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
456 }
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 /********************************* ProtDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
459
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
460 ProtDeclaration::ProtDeclaration(enum PROT p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
461 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
462 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
463 protection = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
464 //printf("decl = %p\n", decl);
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
467 Dsymbol *ProtDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
468 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
469 ProtDeclaration *pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
470
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
471 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
472 pd = new ProtDeclaration(protection, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
473 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
474 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
475
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
476 void ProtDeclaration::semantic(Scope *sc)
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 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
479 { enum PROT protection_save = sc->protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
480 int explicitProtection_save = sc->explicitProtection;
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 sc->protection = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
483 sc->explicitProtection = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
484 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
485 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
486 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
487
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
488 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
489 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
490 sc->protection = protection_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
491 sc->explicitProtection = explicitProtection_save;
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
494 { sc->protection = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
495 sc->explicitProtection = 1;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
498
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
499 void ProtDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
500 { const char *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
501
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
502 switch (protection)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
503 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
504 case PROTprivate: p = "private"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
505 case PROTpackage: p = "package"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
506 case PROTprotected: p = "protected"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
507 case PROTpublic: p = "public"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
508 case PROTexport: p = "export"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
509 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
510 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
511 break;
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 buf->writestring(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
514 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
515 }
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 /********************************* AlignDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
518
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
519 AlignDeclaration::AlignDeclaration(Loc loc, unsigned sa, Array *decl)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
520 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
521 {
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
522 this->loc = loc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
523 salign = sa;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
524 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
525
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
526 Dsymbol *AlignDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
527 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
528 AlignDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
529
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
530 assert(!s);
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
531 ad = new AlignDeclaration(loc, salign, Dsymbol::arraySyntaxCopy(decl));
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
532 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
533 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
534
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
535 void AlignDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
536 {
737
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
537 // LDC
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
538 // we only support packed structs, as from the spec: align(1) struct Packed { ... }
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
539 // other alignments are simply ignored. my tests show this is what llvm-gcc does too ...
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
540
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
541 //printf("\tAlignDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
542 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
543 { unsigned salign_save = sc->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
544
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
545 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
546 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
547 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
548
737
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
549 if (s->isStructDeclaration() && salign == 1)
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
550 {
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
551 sc->structalign = salign;
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
552 s->semantic(sc);
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
553 sc->structalign = salign_save;
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
554 }
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
555 else
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
556 {
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
557 s->semantic(sc);
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
558 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
559 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
560 sc->structalign = salign_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
561 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
562 else
737
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
563 assert(0 && "what kind of align use triggers this?");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
564 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
567 void AlignDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
568 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
569 buf->printf("align (%d)", salign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
570 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
571 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
572
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
573 /********************************* AnonDeclaration ****************************/
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 AnonDeclaration::AnonDeclaration(Loc loc, int isunion, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
576 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
577 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
578 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
579 this->isunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
580 this->scope = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
581 this->sem = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
582 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
583
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
584 Dsymbol *AnonDeclaration::syntaxCopy(Dsymbol *s)
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 AnonDeclaration *ad;
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 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
589 ad = new AnonDeclaration(loc, isunion, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
590 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
591 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
592
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
593 void AnonDeclaration::semantic(Scope *sc)
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 //printf("\tAnonDeclaration::semantic %s %p\n", isunion ? "union" : "struct", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
596
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
597 Scope *scx = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
598 if (scope)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
599 { sc = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
600 scx = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
601 scope = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
602 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
603
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
604 assert(sc->parent);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
605
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
606 Dsymbol *parent = sc->parent->pastMixin();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
607 AggregateDeclaration *ad = parent->isAggregateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
608
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
609 if (!ad || (!ad->isStructDeclaration() && !ad->isClassDeclaration()))
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 error("can only be a part of an aggregate");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
612 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
613 }
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 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
616 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
617 AnonymousAggregateDeclaration aad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
618 int adisunion;
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 if (sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
621 { ad = sc->anonAgg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
622 adisunion = sc->inunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
623 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
624 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
625 adisunion = ad->isUnionDeclaration() != NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
626
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
627 // printf("\tsc->anonAgg = %p\n", sc->anonAgg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
628 // printf("\tad = %p\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
629 // printf("\taad = %p\n", &aad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
630
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
631 sc = sc->push();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
632 sc->anonAgg = &aad;
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
633 sc->stc &= ~(STCauto | STCscope | STCstatic | STCtls);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
634 sc->inunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
635 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
636 sc->flags = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
637 aad.structalign = sc->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
638 aad.parent = ad;
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 816
diff changeset
639
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
640 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
641 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
642 Dsymbol *s = (Dsymbol *)decl->data[i];
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 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
645 if (isunion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
646 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
647 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
648 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
649 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
650 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
651 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
652 sc = sc->pop();
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 // If failed due to forward references, unwind and try again later
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
655 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
656 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
657 ad->sizeok = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
658 //printf("\tsetting ad->sizeok %p to 2\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
659 if (!sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
660 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
661 scope = scx ? scx : new Scope(*sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
662 scope->setNoFree();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
663 scope->module->addDeferredSemantic(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
664 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
665 //printf("\tforward reference %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
666 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
667 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
668 if (sem == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
669 { Module::dprogress++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
670 sem = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
671 //printf("\tcompleted %p\n", this);
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
674 ;//printf("\talready completed %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
675
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
676 // 0 sized structs are set to 1 byte
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
677 if (aad.structsize == 0)
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 aad.structsize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
680 aad.alignsize = 1;
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 // Align size of anonymous aggregate
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
684 //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
685 ad->alignmember(aad.structalign, aad.alignsize, &sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
686 //ad->structsize = sc->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
687 //printf("sc->offset = %d\n", sc->offset);
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 // Add members of aad to ad
737
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
690 //printf("\tadding members of aad (%p) to '%s'\n", &aad, ad->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
691 for (unsigned i = 0; i < aad.fields.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
692 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
693 VarDeclaration *v = (VarDeclaration *)aad.fields.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
694
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
695 // LDC
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
696 v->offset2 = sc->offset;
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
697
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
698 v->offset += sc->offset;
737
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
699
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
700 // LDC
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
701 if (!v->anonDecl)
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
702 v->anonDecl = this;
041c1596d217 Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 723
diff changeset
703
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
704 ad->fields.push(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
705 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
706
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
707 // Add size of aad to ad
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
708 if (adisunion)
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 if (aad.structsize > ad->structsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
711 ad->structsize = aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
712 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
713 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
714 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
715 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
716 ad->structsize = sc->offset + aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
717 sc->offset = ad->structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
718 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
719
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
720 if (ad->alignsize < aad.alignsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
721 ad->alignsize = aad.alignsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
722 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
723 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
724
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
725
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
726 void AnonDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
727 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
728 buf->printf(isunion ? "union" : "struct");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
729 buf->writestring("\n{\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
730 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
731 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
732 for (unsigned i = 0; i < decl->dim; i++)
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 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
735
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
736 //buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
737 s->toCBuffer(buf, hgs);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
740 buf->writestring("}\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
741 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
742
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
743 const char *AnonDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
744 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
745 return (isunion ? "anonymous union" : "anonymous struct");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
746 }
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 /********************************* PragmaDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
749
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 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
751 {
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
752 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
753
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
754 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
755 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
756 {
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
757 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
758 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
759 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
760 }
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
761 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
762 }
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
763
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
764 PragmaDeclaration::PragmaDeclaration(Loc loc, Identifier *ident, Expressions *args, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
765 : AttribDeclaration(decl)
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 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
768 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
769 this->args = args;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
770 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
771
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
772 Dsymbol *PragmaDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
773 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
774 //printf("PragmaDeclaration::syntaxCopy(%s)\n", toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
775 PragmaDeclaration *pd;
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 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
778 pd = new PragmaDeclaration(loc, ident,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
779 Expression::arraySyntaxCopy(args), Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
780 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
781 }
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 void PragmaDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
784 { // Should be merged with PragmaStatement
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
785
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
786 #if IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
787 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
788 std::string arg1str;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
789
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
790 #endif
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 //printf("\tPragmaDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
793 if (ident == Id::msg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
794 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
795 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
796 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
797 for (size_t i = 0; i < args->dim; i++)
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 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
800
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
801 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
802 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
803 if (e->op == TOKstring)
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 StringExp *se = (StringExp *)e;
794
661384d6a936 Fix warnings on x86-64. By fvbommel.
Christian Kamm <kamm incasoftware de>
parents: 737
diff changeset
806 fprintf(stdmsg, "%.*s", (int)se->len, (char*)se->string);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
807 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
808 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
809 error("string expected for message, not '%s'", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
810 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
811 fprintf(stdmsg, "\n");
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 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
814 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
815 else if (ident == Id::lib)
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 if (!args || args->dim != 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
818 error("string expected for library name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
819 else
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 Expression *e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
822
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
823 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
824 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
825 args->data[0] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
826 if (e->op != TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
827 error("string expected for library name, not '%s'", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
828 else if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
829 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
830 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
831 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
832 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
833 name[se->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
834 printf("library %s\n", name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
835 mem.free(name);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
838 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
839 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
840 #if IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
841 else if (ident == Id::GNU_asm)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
842 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
843 if (! args || args->dim != 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
844 error("identifier and string expected for asm name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
845 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
846 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
847 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
848 Declaration *d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
849 StringExp *s = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
850
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
851 e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
852 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
853 if (e->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
854 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
855 d = ((VarExp *)e)->var;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
856 if (! d->isFuncDeclaration() && ! d->isVarDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
857 d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
858 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
859 if (!d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
860 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
861
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
862 e = (Expression *)args->data[1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
863 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
864 e = e->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
865 if (e->op == TOKstring && ((StringExp *)e)->sz == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
866 s = ((StringExp *)e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
867 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
868 error("second argument of GNU_asm must be a char string");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
869
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
870 if (d && s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
871 d->c_ident = Lexer::idPool((char*) s->string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
872 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
873 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
874 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
875 #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
876
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
877 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
878 #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
879
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
880 // 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
881 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
882 {
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 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
884 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
885 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
886 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
887 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
888 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
889 }
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 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
891 }
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
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
893 // 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
894 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
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 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
897 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
898 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
899 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
900 }
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
901 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
902 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
903
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
904 // 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
905 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
906 {
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
907 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
908 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
909 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
910 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
911 }
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
912 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
913 }
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
914
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
915 // 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
916 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
917 {
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
918 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
919 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
920 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
921 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
922 }
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 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
924 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
925
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
926 // 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
927 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
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 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
930 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
931 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
932 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
933 }
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
934 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
935 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
936
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
937 // 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
938 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
939 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
940 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
941 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
942 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
943 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
944 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
945 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
946 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
947
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
948 // 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
949 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
950 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
951 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
952 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
953 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
954 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
955 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
956 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
957 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
958
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
959 // 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
960 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
961 {
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
962 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
963 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
964 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
965 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
966 }
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
967 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
968 }
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
969
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
970 // pragma(ldc, "string") { templdecl(s) }
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
971 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
972 {
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
973 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
974 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
975 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
976 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
977 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
978 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
979 }
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
980 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
981 {
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
982 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
983 }
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
984 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
985 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
986 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
987 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
988 }
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
989 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
990
1152
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
991 // pragma(llvm_inline_asm) { templdecl(s) }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
992 else if (ident == Id::llvm_inline_asm)
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
993 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
994 if (args && args->dim > 0)
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
995 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
996 error("takes no parameters");
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
997 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
998 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
999 llvm_internal = LLVMinline_asm;
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1000 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1001
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1002 #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
1003
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
1004 else if (ignoreUnsupportedPragmas)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1005 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1006 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1007 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1008 /* Print unrecognized pragmas
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1009 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1010 printf("pragma %s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1011 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1012 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1013 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1014 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1015 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1016 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1017 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1018 if (i == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1019 printf(" (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1020 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1021 printf(",");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1022 printf("%s", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1023 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1024 if (args->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1025 printf(")");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1026 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1027 printf("\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1028 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1029 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1030 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1031 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1032 error("unrecognized pragma(%s)", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1033
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1034 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1035 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1036 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1037 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1038 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1039
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1040 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
1041
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1042 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1043 #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
1044
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1045 if (llvm_internal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1046 {
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
1047 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
1048 {
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1049 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
1050 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
1051 }
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
1052 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
1053 {
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
1054 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
1055 if (FuncDeclaration* fd = s->isFuncDeclaration())
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1056 {
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
1057 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
1058 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
1059 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
1060 ((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
1061 }
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1062 else if (TemplateDeclaration* td = s->isTemplateDeclaration())
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1063 {
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1064 td->llvmInternal = llvm_internal;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1065 td->intrinsicName = arg1str;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1066 }
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
1067 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
1068 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1069 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
1070 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
1071 }
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 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
1073
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 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
1075 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
1076 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
1077 {
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 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
1079 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1080 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
1081 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1082 }
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
1083 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
1084 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1085 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
1086 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1087 }
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 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
1089 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1090 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
1091 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1092 }
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
1093 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
1094 }
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
1095 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
1096 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1097 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
1098 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1099 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1100 break;
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1101
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1102 case LLVMva_copy:
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1103 case LLVMva_end:
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1104 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
1105 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1106 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
1107 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1108 else
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1109 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1110 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
1111 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
1112 }
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
1113 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1114
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
1115 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
1116 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
1117 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1118
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
1119 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
1120 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
1121 {
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
1122 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
1123 }
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
1124 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
1125 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1126 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
1127 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
1128 }
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
1129 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1130
1152
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1131 case LLVMinline_asm:
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1132 if (TemplateDeclaration* td = s->isTemplateDeclaration())
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1133 {
1153
4454126b4345 Added support for single D type register return from __asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1152
diff changeset
1134 if (td->parameters->dim > 1)
1152
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1135 {
1153
4454126b4345 Added support for single D type register return from __asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1152
diff changeset
1136 error("the '%s' pragma template must have exactly zero or one template parameters", ident->toChars());
1152
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1137 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1138 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1139 else if (!td->onemember)
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1140 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1141 error("the '%s' pragma template must have exactly one member", ident->toChars());
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1142 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1143 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1144 td->llvmInternal = llvm_internal;
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1145 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1146 else
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1147 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1148 error("the '%s' pragma is only allowed on template declarations", ident->toChars());
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1149 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1150 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1151 break;
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1152
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
1153 default:
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1154 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
1155 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1156 }
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
1157
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1158 #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
1159
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1160 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1161 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1162 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1163
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1164 Lnodecl:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1165 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1166 error("pragma is missing closing ';'");
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1169 int PragmaDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1170 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1171 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1172 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1173 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1174
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1175 const char *PragmaDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1176 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1177 return "pragma";
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
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
1180 #if IN_DMD
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1181 void PragmaDeclaration::toObjFile(int multiobj)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1182 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1183 if (ident == Id::lib)
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 assert(args && args->dim == 1);
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 Expression *e = (Expression *)args->data[0];
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 assert(e->op == TOKstring);
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 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1192 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1193 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1194 name[se->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1195 obj_includelib(name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1196 }
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1197 #if DMDV2
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1198 else if (ident == Id::startaddress)
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1199 {
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1200 assert(args && args->dim == 1);
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1201 Expression *e = (Expression *)args->data[0];
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1202 Dsymbol *sa = getDsymbol(e);
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1203 FuncDeclaration *f = sa->isFuncDeclaration();
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1204 assert(f);
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1205 Symbol *s = f->toSymbol();
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1206 obj_startaddress(s);
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1207 }
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1208 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1209 AttribDeclaration::toObjFile(multiobj);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1210 }
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
1211 #endif
159
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 void PragmaDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
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 buf->printf("pragma(%s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1216 if (args)
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 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1219 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1220 Expression *e = (Expression *)args->data[i];
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 buf->writestring(", ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1223 e->toCBuffer(buf, hgs);
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 buf->writestring(")");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1227 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1228 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1231 /********************************* ConditionalDeclaration ****************************/
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 ConditionalDeclaration::ConditionalDeclaration(Condition *condition, Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1234 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1235 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1236 //printf("ConditionalDeclaration::ConditionalDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1237 this->condition = condition;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1238 this->elsedecl = elsedecl;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1241 Dsymbol *ConditionalDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1242 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1243 ConditionalDeclaration *dd;
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 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1246 dd = new ConditionalDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1247 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1248 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1249 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1250 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1251
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1252
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1253 int ConditionalDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1254 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1255 //printf("ConditionalDeclaration::oneMember(), inc = %d\n", condition->inc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1256 if (condition->inc)
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 Array *d = condition->include(NULL, NULL) ? decl : elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1259 return Dsymbol::oneMembers(d, ps);
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 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1262 return TRUE;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1265 void ConditionalDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1266 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1267 //printf("ConditionalDeclaration::emitComment(sc = %p)\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1268 if (condition->inc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1269 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1270 AttribDeclaration::emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1271 }
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1272 else if (sc->docbuf)
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1273 {
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1274 /* If generating doc comment, be careful because if we're inside
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1275 * a template, then include(NULL, NULL) will fail.
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1276 */
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1277 Array *d = decl ? decl : elsedecl;
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1278 for (unsigned i = 0; i < d->dim; i++)
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1279 { Dsymbol *s = (Dsymbol *)d->data[i];
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1280 s->emitComment(sc);
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1281 }
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1282 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1283 }
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 // Decide if 'then' or 'else' code should be included
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1286
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1287 Array *ConditionalDeclaration::include(Scope *sc, ScopeDsymbol *sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1288 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1289 //printf("ConditionalDeclaration::include()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1290 assert(condition);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1291 return condition->include(sc, sd) ? decl : elsedecl;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1294
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1295 void ConditionalDeclaration::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1296 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1297 /* Because addComment is called by the parser, if we called
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1298 * include() it would define a version before it was used.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1299 * 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
1300 * so that's the workaround.
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1303 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1304 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1305 Array *d = decl;
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 for (int j = 0; j < 2; j++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1308 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1309 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1310 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1311 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1312 { Dsymbol *s;
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 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1315 //printf("ConditionalDeclaration::addComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1316 s->addComment(comment);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1319 d = elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1320 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1321 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1322 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1323
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1324 void ConditionalDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1325 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1326 condition->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1327 if (decl || elsedecl)
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 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1330 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1331 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1332 if (decl)
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 for (unsigned i = 0; i < decl->dim; i++)
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 Dsymbol *s = (Dsymbol *)decl->data[i];
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 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1339 s->toCBuffer(buf, hgs);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1342 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1343 if (elsedecl)
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 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1346 buf->writestring("else");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1347 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1348 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1349 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1350 for (unsigned i = 0; i < elsedecl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1351 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1352 Dsymbol *s = (Dsymbol *)elsedecl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1353
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1354 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1355 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1356 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1357 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1358 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1359 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1360 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1361 buf->writeByte(':');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1362 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1363 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1364
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1365 /***************************** StaticIfDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1366
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1367 StaticIfDeclaration::StaticIfDeclaration(Condition *condition,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1368 Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1369 : ConditionalDeclaration(condition, decl, elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1370 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1371 //printf("StaticIfDeclaration::StaticIfDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1372 sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1373 addisdone = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1374 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1377 Dsymbol *StaticIfDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1378 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1379 StaticIfDeclaration *dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1380
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1381 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1382 dd = new StaticIfDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1383 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1384 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1385 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1386 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1387
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1388
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1389 int StaticIfDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1390 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1391 //printf("StaticIfDeclaration::addMember() '%s'\n",toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1392 /* This is deferred until semantic(), so that
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1393 * expressions in the condition can refer to declarations
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1394 * in the same scope, such as:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1395 *
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1396 * template Foo(int i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1397 * {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1398 * const int j = i + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1399 * static if (j == 3)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1400 * const int k;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1401 * }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1402 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1403 this->sd = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1404 int m = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1405
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1406 if (memnum == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1407 { m = AttribDeclaration::addMember(sc, sd, memnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1408 addisdone = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1409 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1410 return m;
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
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 void StaticIfDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1415 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1416 Array *d = include(sc, sd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1417
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1418 //printf("\tStaticIfDeclaration::semantic '%s', d = %p\n",toChars(), d);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1419 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1420 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1421 if (!addisdone)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1422 { AttribDeclaration::addMember(sc, sd, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1423 addisdone = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1424 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1425
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1426 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1427 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1428 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1429
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1430 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1431 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1432 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1433 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1434
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1435 const char *StaticIfDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1436 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1437 return "static if";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1438 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1439
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1440
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1441 /***************************** CompileDeclaration *****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1442
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1443 CompileDeclaration::CompileDeclaration(Loc loc, Expression *exp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1444 : AttribDeclaration(NULL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1445 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1446 //printf("CompileDeclaration(loc = %d)\n", loc.linnum);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1447 this->loc = loc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1448 this->exp = exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1449 this->sd = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1450 this->compiled = 0;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1451 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1452
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1453 Dsymbol *CompileDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1454 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1455 //printf("CompileDeclaration::syntaxCopy('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1456 CompileDeclaration *sc = new CompileDeclaration(loc, exp->syntaxCopy());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1457 return sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1458 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1459
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1460 int CompileDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1461 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
1462 //printf("CompileDeclaration::addMember(sc = %p, memnum = %d)\n", sc, memnum);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1463 this->sd = sd;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1464 if (memnum == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1465 { /* No members yet, so parse the mixin now
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1466 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1467 compileIt(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1468 memnum |= AttribDeclaration::addMember(sc, sd, memnum);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1469 compiled = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1470 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1471 return memnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1472 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1473
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1474 void CompileDeclaration::compileIt(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1475 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1476 //printf("CompileDeclaration::compileIt(loc = %d)\n", loc.linnum);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1477 exp = exp->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1478 exp = resolveProperties(sc, exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1479 exp = exp->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1480 if (exp->op != TOKstring)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1481 { 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
1482 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1483 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1484 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1485 StringExp *se = (StringExp *)exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1486 se = se->toUTF8(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1487 Parser p(sc->module, (unsigned char *)se->string, se->len, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1488 p.loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1489 p.nextToken();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1490 decl = p.parseDeclDefs(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1491 if (p.token.value != TOKeof)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1492 exp->error("incomplete mixin declaration (%s)", se->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1493 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1494 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1495
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1496 void CompileDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1497 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1498 //printf("CompileDeclaration::semantic()\n");
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1499
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1500 if (!compiled)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1501 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1502 compileIt(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1503 AttribDeclaration::addMember(sc, sd, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1504 compiled = 1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1505 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1506 AttribDeclaration::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1507 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1508
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1509 void CompileDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1510 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1511 buf->writestring("mixin(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1512 exp->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1513 buf->writestring(");");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1514 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1515 }