annotate dmd/attrib.c @ 1168:ab186e535e72

A different fix to #218 and DMD2682 that does not lead to constant folding regressions. Fixes run/const_15, run/c/const_16_B. The price is removing the lvalueness of struct literals. If it turns out too much code depends on this behavior or we don't want to break with DMD, we could keep struct literals as lvalues and instead convert struct literals used as expression initializers into struct initializers.
author Christian Kamm <kamm incasoftware de>
date Sun, 29 Mar 2009 11:43:45 +0200
parents 4454126b4345
children e961851fb8be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
2 // Compiler implementation of the D programming language
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
3 // Copyright (c) 1999-2008 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
11 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
12 #include <stdlib.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
13 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
14
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
325 void StorageClassDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
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 int written = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
354 for (int i = 0; i < sizeof(table)/sizeof(table[0]); i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
355 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
356 if (stc & table[i].stc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
357 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
358 if (written)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
359 buf->writeByte(' ');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
360 written = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
361 buf->writestring(Token::toChars(table[i].tok));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
362 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
363 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
364
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
365 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
366 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
367
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
368 /********************************* LinkDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
369
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
370 LinkDeclaration::LinkDeclaration(enum LINK p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
371 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
372 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
373 //printf("LinkDeclaration(linkage = %d, decl = %p)\n", p, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
374 linkage = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
375 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
376
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
377 Dsymbol *LinkDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
378 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
379 LinkDeclaration *ld;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
380
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
381 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
382 ld = new LinkDeclaration(linkage, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
383 return ld;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
384 }
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 void LinkDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
387 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
388 //printf("LinkDeclaration::semantic(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
389 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
390 { enum LINK linkage_save = sc->linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
391
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
392 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
393 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
394 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
395 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
396
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
397 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
398 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
399 sc->linkage = linkage_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
400 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
401 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
402 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
403 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
404 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
405 }
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 void LinkDeclaration::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
408 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
409 //printf("LinkDeclaration::semantic3(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
410 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
411 { enum LINK linkage_save = sc->linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
412
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
413 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
414 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
415 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
416 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
417
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
418 s->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
419 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
420 sc->linkage = linkage_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
421 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
422 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
423 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
424 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
425 }
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 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
429 { const char *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
430
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
431 switch (linkage)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
432 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
433 case LINKd: p = "D"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
434 case LINKc: p = "C"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
435 case LINKcpp: p = "C++"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
436 case LINKwindows: p = "Windows"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
437 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
438
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
439 // LDC
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
440 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
441
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
442 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
443 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
444 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
445 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
446 buf->writestring("extern (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
447 buf->writestring(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
448 buf->writestring(") ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
449 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
450 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
451
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
452 char *LinkDeclaration::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
453 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
454 return (char *)"extern ()";
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
455 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
456
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
457 /********************************* ProtDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
458
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
459 ProtDeclaration::ProtDeclaration(enum PROT p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
460 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
461 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
462 protection = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
463 //printf("decl = %p\n", decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
464 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
465
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
466 Dsymbol *ProtDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
467 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
468 ProtDeclaration *pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
469
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
470 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
471 pd = new ProtDeclaration(protection, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
472 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
473 }
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 void ProtDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
476 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
477 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
478 { enum PROT protection_save = sc->protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
479 int explicitProtection_save = sc->explicitProtection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
480
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
481 sc->protection = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
482 sc->explicitProtection = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
483 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
484 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
485 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
486
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
487 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
488 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
489 sc->protection = protection_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
490 sc->explicitProtection = explicitProtection_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
491 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
492 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
493 { sc->protection = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
494 sc->explicitProtection = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
495 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
496 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
497
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
498 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
499 { const char *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
500
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
501 switch (protection)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
502 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
503 case PROTprivate: p = "private"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
504 case PROTpackage: p = "package"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
505 case PROTprotected: p = "protected"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
506 case PROTpublic: p = "public"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
507 case PROTexport: p = "export"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
508 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
509 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
510 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
511 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
512 buf->writestring(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
513 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
514 }
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 /********************************* AlignDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
517
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
518 AlignDeclaration::AlignDeclaration(Loc loc, unsigned sa, Array *decl)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
519 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
520 {
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
521 this->loc = loc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
522 salign = sa;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
523 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
524
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
525 Dsymbol *AlignDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
526 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
527 AlignDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
528
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
529 assert(!s);
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
530 ad = new AlignDeclaration(loc, salign, Dsymbol::arraySyntaxCopy(decl));
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
531 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
532 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
533
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
534 void AlignDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
535 {
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
536 // 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
537 // 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
538 // 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
539
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
540 //printf("\tAlignDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
541 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
542 { unsigned salign_save = sc->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
543
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
544 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
545 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
546 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
547
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
548 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
549 {
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 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
551 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
552 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
553 }
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 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
555 {
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 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
557 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
558 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
559 sc->structalign = salign_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
560 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
561 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
562 assert(0 && "what kind of align use triggers this?");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
563 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
564
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 void AlignDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
567 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
568 buf->printf("align (%d)", salign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
569 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
570 }
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 /********************************* AnonDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
573
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
574 AnonDeclaration::AnonDeclaration(Loc loc, int isunion, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
575 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
576 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
577 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
578 this->isunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
579 this->scope = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
580 this->sem = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
581 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
582
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
583 Dsymbol *AnonDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
584 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
585 AnonDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
586
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
587 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
588 ad = new AnonDeclaration(loc, isunion, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
589 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
590 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
591
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
592 void AnonDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
593 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
594 //printf("\tAnonDeclaration::semantic %s %p\n", isunion ? "union" : "struct", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
595
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
596 Scope *scx = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
597 if (scope)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
598 { sc = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
599 scx = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
600 scope = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
601 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
602
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
603 assert(sc->parent);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
604
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
605 Dsymbol *parent = sc->parent->pastMixin();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
606 AggregateDeclaration *ad = parent->isAggregateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
607
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
608 if (!ad || (!ad->isStructDeclaration() && !ad->isClassDeclaration()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
609 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
610 error("can only be a part of an aggregate");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
611 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
612 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
613
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
614 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
615 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
616 AnonymousAggregateDeclaration aad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
617 int adisunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
618
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
619 if (sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
620 { ad = sc->anonAgg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
621 adisunion = sc->inunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
622 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
623 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
624 adisunion = ad->isUnionDeclaration() != NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
625
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
626 // printf("\tsc->anonAgg = %p\n", sc->anonAgg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
627 // printf("\tad = %p\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
628 // printf("\taad = %p\n", &aad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
629
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
630 sc = sc->push();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
631 sc->anonAgg = &aad;
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
632 sc->stc &= ~(STCauto | STCscope | STCstatic | STCtls);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
633 sc->inunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
634 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
635 sc->flags = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
636 aad.structalign = sc->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
637 aad.parent = ad;
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 816
diff changeset
638
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
639 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
640 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
641 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
642
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
643 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
644 if (isunion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
645 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
646 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
647 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
648 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
649 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
650 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
651 sc = sc->pop();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
652
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
653 // If failed due to forward references, unwind and try again later
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
654 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
655 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
656 ad->sizeok = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
657 //printf("\tsetting ad->sizeok %p to 2\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
658 if (!sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
659 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
660 scope = scx ? scx : new Scope(*sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
661 scope->setNoFree();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
662 scope->module->addDeferredSemantic(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
663 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
664 //printf("\tforward reference %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
665 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
666 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
667 if (sem == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
668 { Module::dprogress++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
669 sem = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
670 //printf("\tcompleted %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
671 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
672 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
673 ;//printf("\talready completed %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
674
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
675 // 0 sized structs are set to 1 byte
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
676 if (aad.structsize == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
677 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
678 aad.structsize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
679 aad.alignsize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
680 }
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 // Align size of anonymous aggregate
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
683 //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
684 ad->alignmember(aad.structalign, aad.alignsize, &sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
685 //ad->structsize = sc->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
686 //printf("sc->offset = %d\n", sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
687
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
688 // 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
689 //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
690 for (unsigned i = 0; i < aad.fields.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
691 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
692 VarDeclaration *v = (VarDeclaration *)aad.fields.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
693
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
694 // LDC
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
695 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
696
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
697 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
698
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 // 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
700 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
701 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
702
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
703 ad->fields.push(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
704 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
705
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
706 // Add size of aad to ad
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
707 if (adisunion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
708 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
709 if (aad.structsize > ad->structsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
710 ad->structsize = aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
711 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
712 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
713 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
714 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
715 ad->structsize = sc->offset + aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
716 sc->offset = ad->structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
717 }
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 if (ad->alignsize < aad.alignsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
720 ad->alignsize = aad.alignsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
721 }
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 void AnonDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
726 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
727 buf->printf(isunion ? "union" : "struct");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
728 buf->writestring("\n{\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
729 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
730 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
731 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
732 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
733 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
734
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
735 //buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
736 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
737 }
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 buf->writestring("}\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
740 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
741
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
742 const char *AnonDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
743 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
744 return (isunion ? "anonymous union" : "anonymous struct");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
745 }
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 /********************************* PragmaDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
748
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
749 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
750 {
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 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
752
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 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
754 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
755 {
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 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
757 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
758 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
759 }
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 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
761 }
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
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
763 PragmaDeclaration::PragmaDeclaration(Loc loc, Identifier *ident, Expressions *args, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
764 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
765 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
766 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
767 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
768 this->args = args;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
769 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
770
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
771 Dsymbol *PragmaDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
772 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
773 //printf("PragmaDeclaration::syntaxCopy(%s)\n", toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
774 PragmaDeclaration *pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
775
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
776 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
777 pd = new PragmaDeclaration(loc, ident,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
778 Expression::arraySyntaxCopy(args), Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
779 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
780 }
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 void PragmaDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
783 { // Should be merged with PragmaStatement
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
784
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
785 #if IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
786 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
787 std::string arg1str;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
788
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
789 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
790
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
791 //printf("\tPragmaDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
792 if (ident == Id::msg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
793 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
794 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
795 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
796 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
797 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
798 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
799
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
800 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
801 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
802 if (e->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
803 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
804 StringExp *se = (StringExp *)e;
794
661384d6a936 Fix warnings on x86-64. By fvbommel.
Christian Kamm <kamm incasoftware de>
parents: 737
diff changeset
805 fprintf(stdmsg, "%.*s", (int)se->len, (char*)se->string);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
806 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
807 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
808 error("string expected for message, not '%s'", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
809 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
810 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
811 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
812 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
813 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
814 else if (ident == Id::lib)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
815 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
816 if (!args || args->dim != 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
817 error("string expected for library name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
818 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
819 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
820 Expression *e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
821
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
822 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
823 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
824 args->data[0] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
825 if (e->op != TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
826 error("string expected for library name, not '%s'", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
827 else if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
828 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
829 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
830 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
831 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
832 name[se->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
833 printf("library %s\n", name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
834 mem.free(name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
835 }
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 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
838 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
839 #if IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
840 else if (ident == Id::GNU_asm)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
841 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
842 if (! args || args->dim != 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
843 error("identifier and string expected for asm name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
844 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
845 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
846 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
847 Declaration *d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
848 StringExp *s = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
849
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
850 e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
851 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
852 if (e->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
853 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
854 d = ((VarExp *)e)->var;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
855 if (! d->isFuncDeclaration() && ! d->isVarDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
856 d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
857 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
858 if (!d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
859 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
860
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
861 e = (Expression *)args->data[1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
862 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
863 e = e->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
864 if (e->op == TOKstring && ((StringExp *)e)->sz == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
865 s = ((StringExp *)e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
866 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
867 error("second argument of GNU_asm must be a char string");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
868
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
869 if (d && s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
870 d->c_ident = Lexer::idPool((char*) s->string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
871 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
872 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
873 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
874 #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
875
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
876 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
877 #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
878
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
879 // 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
880 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
881 {
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 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
883 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
884 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
885 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
886 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
887 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
888 }
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 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
890 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
891
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 // 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
893 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
894 {
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 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
896 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
897 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
898 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
899 }
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 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
901 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
902
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
903 // 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
904 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
905 {
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 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
907 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
908 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
909 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
910 }
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 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
912 }
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 // 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
915 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
916 {
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 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
918 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
919 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
920 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
921 }
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 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
923 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
924
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
925 // 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
926 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
927 {
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 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
929 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
930 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
931 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
932 }
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 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
934 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
935
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
936 // 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
937 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
938 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
939 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
940 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
941 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
942 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
943 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
944 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
945 }
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 // 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
948 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
949 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
950 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
951 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
952 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
953 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
954 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
955 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
956 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
957
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
958 // 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
959 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
960 {
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 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
962 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
963 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
964 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
965 }
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 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
967 }
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
968
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
969 // pragma(ldc, "string") { templdecl(s) }
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
970 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
971 {
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 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
973 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
974 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
975 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
976 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
977 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
978 }
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 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
980 {
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 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
982 }
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 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
984 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
985 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
986 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
987 }
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 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
989
1152
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
990 // 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
991 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
992 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
993 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
994 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
995 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
996 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
997 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
998 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
999 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1000
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1001 #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
1002
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
1003 else if (ignoreUnsupportedPragmas)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1004 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1005 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1006 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1007 /* Print unrecognized pragmas
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1008 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1009 printf("pragma %s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1010 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1011 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1012 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1013 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1014 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1015 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1016 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1017 if (i == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1018 printf(" (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1019 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1020 printf(",");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1021 printf("%s", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1022 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1023 if (args->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1024 printf(")");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1025 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1026 printf("\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1027 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1028 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1029 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1030 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1031 error("unrecognized pragma(%s)", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1032
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1033 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1034 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1035 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1036 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1037 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1038
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1039 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
1040
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1041 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1042 #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
1043
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1044 if (llvm_internal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1045 {
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
1046 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
1047 {
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1048 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
1049 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
1050 }
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 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
1052 {
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 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
1054 if (FuncDeclaration* fd = s->isFuncDeclaration())
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1055 {
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
1056 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
1057 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
1058 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
1059 ((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
1060 }
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1061 else if (TemplateDeclaration* td = s->isTemplateDeclaration())
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1062 {
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1063 td->llvmInternal = llvm_internal;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1064 td->intrinsicName = arg1str;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1065 }
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1066 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
1067 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1068 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
1069 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
1070 }
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 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
1072
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1073 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
1074 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
1075 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
1076 {
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 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
1078 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1079 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
1080 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1081 }
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1082 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
1083 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1084 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
1085 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1086 }
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
1087 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
1088 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1089 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
1090 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1091 }
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
1092 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
1093 }
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 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
1095 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1096 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
1097 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1098 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1099 break;
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1100
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1101 case LLVMva_copy:
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1102 case LLVMva_end:
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1103 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
1104 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1105 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
1106 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1107 else
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1108 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1109 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
1110 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
1111 }
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 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1113
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
1114 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
1115 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
1116 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1117
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
1118 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
1119 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
1120 {
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 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
1122 }
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 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
1124 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1125 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
1126 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
1127 }
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 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1129
1152
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1130 case LLVMinline_asm:
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1131 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
1132 {
1153
4454126b4345 Added support for single D type register return from __asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1152
diff changeset
1133 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
1134 {
1153
4454126b4345 Added support for single D type register return from __asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1152
diff changeset
1135 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
1136 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1137 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1138 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
1139 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1140 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
1141 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1142 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1143 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
1144 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1145 else
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1146 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1147 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
1148 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1149 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1150 break;
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1151
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
1152 default:
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1153 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
1154 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1155 }
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
1156
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1157 #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
1158
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1159 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1160 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1161 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1162
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1163 Lnodecl:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1164 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1165 error("pragma is missing closing ';'");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1166 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1167
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1168 int PragmaDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1169 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1170 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1171 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1172 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1173
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1174 const char *PragmaDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1175 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1176 return "pragma";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1177 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1178
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
1179 #if IN_DMD
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1180 void PragmaDeclaration::toObjFile(int multiobj)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1181 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1182 if (ident == Id::lib)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1183 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1184 assert(args && args->dim == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1185
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1186 Expression *e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1187
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1188 assert(e->op == TOKstring);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1189
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1190 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1191 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1192 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1193 name[se->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1194 obj_includelib(name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1195 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1196 AttribDeclaration::toObjFile(multiobj);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1197 }
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
1198 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1199
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1200 void PragmaDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1201 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1202 buf->printf("pragma(%s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1203 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1204 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1205 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1206 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1207 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1208
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1209 buf->writestring(", ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1210 e->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1211 }
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 buf->writestring(")");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1214 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1215 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1216
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 /********************************* ConditionalDeclaration ****************************/
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 ConditionalDeclaration::ConditionalDeclaration(Condition *condition, Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1221 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1222 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1223 //printf("ConditionalDeclaration::ConditionalDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1224 this->condition = condition;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1225 this->elsedecl = elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1226 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1227
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1228 Dsymbol *ConditionalDeclaration::syntaxCopy(Dsymbol *s)
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 ConditionalDeclaration *dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1231
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1232 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1233 dd = new ConditionalDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1234 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1235 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1236 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1237 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1238
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 int ConditionalDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1241 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1242 //printf("ConditionalDeclaration::oneMember(), inc = %d\n", condition->inc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1243 if (condition->inc)
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 Array *d = condition->include(NULL, NULL) ? decl : elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1246 return Dsymbol::oneMembers(d, ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1247 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1248 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1249 return TRUE;
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 void ConditionalDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1253 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1254 //printf("ConditionalDeclaration::emitComment(sc = %p)\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1255 if (condition->inc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1256 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1257 AttribDeclaration::emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1258 }
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1259 else if (sc->docbuf)
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1260 {
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1261 /* 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
1262 * 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
1263 */
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1264 Array *d = decl ? decl : elsedecl;
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1265 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
1266 { Dsymbol *s = (Dsymbol *)d->data[i];
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1267 s->emitComment(sc);
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1268 }
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1269 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1270 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1271
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1272 // Decide if 'then' or 'else' code should be included
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1273
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1274 Array *ConditionalDeclaration::include(Scope *sc, ScopeDsymbol *sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1275 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1276 //printf("ConditionalDeclaration::include()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1277 assert(condition);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1278 return condition->include(sc, sd) ? decl : elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1279 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1280
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1281
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1282 void ConditionalDeclaration::addComment(unsigned char *comment)
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 /* Because addComment is called by the parser, if we called
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1285 * include() it would define a version before it was used.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1286 * 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
1287 * so that's the workaround.
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1290 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1291 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1292 Array *d = decl;
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 for (int j = 0; j < 2; j++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1295 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1296 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1297 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1298 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1299 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1300
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1301 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1302 //printf("ConditionalDeclaration::addComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1303 s->addComment(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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1306 d = elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1307 }
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 }
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 void ConditionalDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1312 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1313 condition->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1314 if (decl || elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1315 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1316 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1317 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1318 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1319 if (decl)
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 for (unsigned i = 0; i < decl->dim; i++)
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 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1324
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1325 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1326 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1327 }
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->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1330 if (elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1331 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1332 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1333 buf->writestring("else");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1334 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1335 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1336 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1337 for (unsigned i = 0; i < elsedecl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1338 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1339 Dsymbol *s = (Dsymbol *)elsedecl->data[i];
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 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1342 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1343 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1344 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1345 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1346 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1347 else
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 }
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 /***************************** StaticIfDeclaration ****************************/
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 StaticIfDeclaration::StaticIfDeclaration(Condition *condition,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1355 Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1356 : ConditionalDeclaration(condition, decl, elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1357 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1358 //printf("StaticIfDeclaration::StaticIfDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1359 sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1360 addisdone = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1361 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1362
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1363
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1364 Dsymbol *StaticIfDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1365 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1366 StaticIfDeclaration *dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1367
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1368 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1369 dd = new StaticIfDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1370 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1371 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1372 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1373 }
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 int StaticIfDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1377 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1378 //printf("StaticIfDeclaration::addMember() '%s'\n",toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1379 /* This is deferred until semantic(), so that
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1380 * expressions in the condition can refer to declarations
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1381 * in the same scope, such as:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1382 *
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1383 * template Foo(int i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1384 * {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1385 * const int j = i + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1386 * static if (j == 3)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1387 * const int k;
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 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1390 this->sd = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1391 int m = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1392
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1393 if (memnum == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1394 { m = AttribDeclaration::addMember(sc, sd, memnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1395 addisdone = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1396 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1397 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1398 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1399
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1400
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1401 void StaticIfDeclaration::semantic(Scope *sc)
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 Array *d = include(sc, sd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1404
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1405 //printf("\tStaticIfDeclaration::semantic '%s', d = %p\n",toChars(), d);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1406 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1407 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1408 if (!addisdone)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1409 { AttribDeclaration::addMember(sc, sd, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1410 addisdone = 1;
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 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1414 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1415 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1416
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1417 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1418 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1419 }
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
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1422 const char *StaticIfDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1423 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1424 return "static if";
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
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 /***************************** CompileDeclaration *****************************/
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 CompileDeclaration::CompileDeclaration(Loc loc, Expression *exp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1431 : AttribDeclaration(NULL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1432 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1433 //printf("CompileDeclaration(loc = %d)\n", loc.linnum);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1434 this->loc = loc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1435 this->exp = exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1436 this->sd = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1437 this->compiled = 0;
159
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 Dsymbol *CompileDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1441 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1442 //printf("CompileDeclaration::syntaxCopy('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1443 CompileDeclaration *sc = new CompileDeclaration(loc, exp->syntaxCopy());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1444 return sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1445 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1446
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1447 int CompileDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1448 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
1449 //printf("CompileDeclaration::addMember(sc = %p, memnum = %d)\n", sc, memnum);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1450 this->sd = sd;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1451 if (memnum == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1452 { /* No members yet, so parse the mixin now
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1453 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1454 compileIt(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1455 memnum |= AttribDeclaration::addMember(sc, sd, memnum);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1456 compiled = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1457 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1458 return memnum;
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
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1461 void CompileDeclaration::compileIt(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1462 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1463 //printf("CompileDeclaration::compileIt(loc = %d)\n", loc.linnum);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1464 exp = exp->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1465 exp = resolveProperties(sc, exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1466 exp = exp->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1467 if (exp->op != TOKstring)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1468 { 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
1469 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1470 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1471 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1472 StringExp *se = (StringExp *)exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1473 se = se->toUTF8(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1474 Parser p(sc->module, (unsigned char *)se->string, se->len, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1475 p.loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1476 p.nextToken();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1477 decl = p.parseDeclDefs(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1478 if (p.token.value != TOKeof)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1479 exp->error("incomplete mixin declaration (%s)", se->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1480 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1481 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1482
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1483 void CompileDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1484 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1485 //printf("CompileDeclaration::semantic()\n");
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1486
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1487 if (!compiled)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1488 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1489 compileIt(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1490 AttribDeclaration::addMember(sc, sd, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1491 compiled = 1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1492 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1493 AttribDeclaration::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1494 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1495
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1496 void CompileDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
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 buf->writestring("mixin(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1499 exp->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1500 buf->writestring(");");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1501 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1502 }