annotate dmd/attrib.c @ 1638:0de4525a9ed6

Apply workaround for #395 by klickverbot.
author Christian Kamm <kamm incasoftware de>
date Mon, 08 Mar 2010 20:06:08 +0100
parents 44b145be2ef5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
2 // Compiler implementation of the D programming language
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
3 // Copyright (c) 1999-2009 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
11 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
12 #include <stdlib.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
13 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
14
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
15 #include "rmem.h"
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
16
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
17 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
18 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
19 #include "attrib.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
20 #include "cond.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
21 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
22 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
23 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
24 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
25 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
26 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
27 #include "parse.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
28 #include "template.h"
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
29 #if TARGET_NET
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
30 #include "frontend.net/pragma.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
31 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
32
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
33 #if IN_LLVM
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
34 #include "../gen/enums.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
35
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
36 #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
37
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
38 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
39 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
40 llvm::cl::ZeroOrMore);
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
41
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
42 #endif
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
43
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
44
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
45 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
46
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
47 #if IN_DMD
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
48 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
49 #endif
159
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
52 /********************************* AttribDeclaration ****************************/
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 AttribDeclaration::AttribDeclaration(Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
55 : Dsymbol()
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 this->decl = decl;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
60 Array *AttribDeclaration::include(Scope *sc, ScopeDsymbol *sd)
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 return decl;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
65 int AttribDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
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 int m = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
68 Array *d = include(sc, sd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
69
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
70 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
71 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
72 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
73 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
74 m |= s->addMember(sc, sd, m | memnum);
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 return m;
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
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
80 void AttribDeclaration::setScopeNewSc(Scope *sc,
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
81 StorageClass stc, enum LINK linkage, enum PROT protection, int explicitProtection,
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
82 unsigned structalign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
83 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
84 if (decl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
85 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
86 Scope *newsc = sc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
87 if (stc != sc->stc ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
88 linkage != sc->linkage ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
89 protection != sc->protection ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
90 explicitProtection != sc->explicitProtection ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
91 structalign != sc->structalign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
92 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
93 // create new one for changes
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
94 newsc = new Scope(*sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
95 newsc->flags &= ~SCOPEfree;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
96 newsc->stc = stc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
97 newsc->linkage = linkage;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
98 newsc->protection = protection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
99 newsc->explicitProtection = explicitProtection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
100 newsc->structalign = structalign;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
101 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
102 for (unsigned i = 0; i < decl->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
103 { Dsymbol *s = (Dsymbol *)decl->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
104
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
105 s->setScope(newsc); // yes, the only difference from semanticNewSc()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
106 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
107 if (newsc != sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
108 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
109 sc->offset = newsc->offset;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
110 newsc->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
111 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
112 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
113 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
114
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
115 void AttribDeclaration::semanticNewSc(Scope *sc,
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
116 StorageClass stc, enum LINK linkage, enum PROT protection, int explicitProtection,
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
117 unsigned structalign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
118 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
119 if (decl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
120 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
121 Scope *newsc = sc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
122 if (stc != sc->stc ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
123 linkage != sc->linkage ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
124 protection != sc->protection ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
125 explicitProtection != sc->explicitProtection ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
126 structalign != sc->structalign)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
127 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
128 // create new one for changes
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
129 newsc = new Scope(*sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
130 newsc->flags &= ~SCOPEfree;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
131 newsc->stc = stc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
132 newsc->linkage = linkage;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
133 newsc->protection = protection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
134 newsc->explicitProtection = explicitProtection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
135 newsc->structalign = structalign;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
136 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
137 for (unsigned i = 0; i < decl->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
138 { Dsymbol *s = (Dsymbol *)decl->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
139
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
140 s->semantic(newsc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
141 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
142 if (newsc != sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
143 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
144 sc->offset = newsc->offset;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
145 newsc->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
146 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
147 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
148 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
149
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
150 void AttribDeclaration::semantic(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 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
153
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
154 //printf("\tAttribDeclaration::semantic '%s', d = %p\n",toChars(), d);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
155 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
156 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
157 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
158 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
159 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
160
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
161 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
162 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
163 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
164 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
165
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
166 void AttribDeclaration::semantic2(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
167 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
168 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
169
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
170 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
171 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
172 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
173 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
174 s->semantic2(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
175 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
176 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
177 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
178
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
179 void AttribDeclaration::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
180 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
181 Array *d = include(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
182
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
183 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
184 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
185 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
186 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
187 s->semantic3(sc);
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 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
192 void AttribDeclaration::inlineScan()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
193 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
194 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
195
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
196 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
197 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
198 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
199 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
200 //printf("AttribDeclaration::inlineScan %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
201 s->inlineScan();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
202 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
206 void AttribDeclaration::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
207 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
208 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
209 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
210 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
211
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
212 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
213 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
214 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
215 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
216 //printf("AttribDeclaration::addComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
217 s->addComment(comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
218 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
219 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
223 void AttribDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
224 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
225 //printf("AttribDeclaration::emitComment(sc = %p)\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
226
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
227 /* 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
228 * 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
229 * 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
230 * 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
231 * (only template instantiations).
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
232 * 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
233 */
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
234
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
235 Array *d = include(NULL, NULL);
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 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
238 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
239 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
240 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
241 //printf("AttribDeclaration::emitComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
242 s->emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
243 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
244 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
245 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
246
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
247 #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
248
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
249 void AttribDeclaration::toObjFile(int multiobj)
159
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 Array *d = include(NULL, NULL);
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 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
254 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
255 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
256 { Dsymbol *s = (Dsymbol *)d->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
257 s->toObjFile(multiobj);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
258 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
259 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
260 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
261
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
262 int AttribDeclaration::cvMember(unsigned char *p)
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 int nwritten = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
265 int n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
266 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
267
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
268 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
269 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
270 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
271 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
272 n = s->cvMember(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
273 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
274 p += n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
275 nwritten += n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
276 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
277 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
278 return nwritten;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
279 }
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
280 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
281
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
282 int AttribDeclaration::hasPointers()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
283 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
284 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
285
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
286 if (d)
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 for (size_t i = 0; i < d->dim; i++)
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 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
291 if (s->hasPointers())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
292 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
293 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
294 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
295 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
296 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
297
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
298 const char *AttribDeclaration::kind()
159
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 return "attribute";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
301 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
302
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
303 int AttribDeclaration::oneMember(Dsymbol **ps)
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 Array *d = include(NULL, NULL);
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 return Dsymbol::oneMembers(d, ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
308 }
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 void AttribDeclaration::checkCtorConstInit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
311 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
312 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
313
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
314 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
315 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
316 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
317 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
318 s->checkCtorConstInit();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
319 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
320 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
321 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
322
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
326 void AttribDeclaration::addLocalClass(ClassDeclarations *aclasses)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
327 {
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
328 Array *d = include(NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
329
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
330 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
331 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
332 for (unsigned i = 0; i < d->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
333 { Dsymbol *s = (Dsymbol *)d->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
334 s->addLocalClass(aclasses);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
335 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
336 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
337 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
338
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
339
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
340 void AttribDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
341 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
342 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
343 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
344 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
345 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
346 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
347 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
348 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
349 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
350
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
351 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
352 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
353 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
354 buf->writeByte('}');
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
357 buf->writeByte(';');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
358 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
359 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
360
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
361 /************************* StorageClassDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
362
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
363 StorageClassDeclaration::StorageClassDeclaration(StorageClass stc, Array *decl)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
364 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
365 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
366 this->stc = stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
367 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
368
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
369 Dsymbol *StorageClassDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
370 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
371 StorageClassDeclaration *scd;
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 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
374 scd = new StorageClassDeclaration(stc, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
375 return scd;
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
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
378 void StorageClassDeclaration::setScope(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
379 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
380 if (decl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
381 {
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
382 StorageClass scstc = sc->stc;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
383
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
384 /* These sets of storage classes are mutually exclusive,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
385 * so choose the innermost or most recent one.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
386 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
387 if (stc & (STCauto | STCscope | STCstatic | STCextern | STCmanifest))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
388 scstc &= ~(STCauto | STCscope | STCstatic | STCextern | STCmanifest);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
389 if (stc & (STCauto | STCscope | STCstatic | STCtls | STCmanifest | STCgshared))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
390 scstc &= ~(STCauto | STCscope | STCstatic | STCtls | STCmanifest | STCgshared);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
391 if (stc & (STCconst | STCimmutable | STCmanifest))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
392 scstc &= ~(STCconst | STCimmutable | STCmanifest);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
393 if (stc & (STCgshared | STCshared | STCtls))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
394 scstc &= ~(STCgshared | STCshared | STCtls);
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
395 if (stc & (STCsafe | STCtrusted | STCsystem))
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
396 scstc &= ~(STCsafe | STCtrusted | STCsystem);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
397 scstc |= stc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
398
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
399 setScopeNewSc(sc, scstc, sc->linkage, sc->protection, sc->explicitProtection, sc->structalign);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
400 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
401 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
402
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
403 void StorageClassDeclaration::semantic(Scope *sc)
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 if (decl)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
406 {
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
407 StorageClass scstc = sc->stc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
408
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
409 /* These sets of storage classes are mutually exclusive,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
410 * so choose the innermost or most recent one.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
411 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
412 if (stc & (STCauto | STCscope | STCstatic | STCextern | STCmanifest))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
413 scstc &= ~(STCauto | STCscope | STCstatic | STCextern | STCmanifest);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
414 if (stc & (STCauto | STCscope | STCstatic | STCtls | STCmanifest | STCgshared))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
415 scstc &= ~(STCauto | STCscope | STCstatic | STCtls | STCmanifest | STCgshared);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
416 if (stc & (STCconst | STCimmutable | STCmanifest))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
417 scstc &= ~(STCconst | STCimmutable | STCmanifest);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
418 if (stc & (STCgshared | STCshared | STCtls))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
419 scstc &= ~(STCgshared | STCshared | STCtls);
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
420 if (stc & (STCsafe | STCtrusted | STCsystem))
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
421 scstc &= ~(STCsafe | STCtrusted | STCsystem);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
422 scstc |= stc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
423
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
424 semanticNewSc(sc, scstc, sc->linkage, sc->protection, sc->explicitProtection, sc->structalign);
159
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
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
428 void StorageClassDeclaration::stcToCBuffer(OutBuffer *buf, StorageClass stc)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
429 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
430 struct SCstring
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
431 {
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
432 StorageClass stc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
433 enum TOK tok;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
434 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
435
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
436 static SCstring table[] =
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
437 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
438 { STCauto, TOKauto },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
439 { STCscope, TOKscope },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
440 { STCstatic, TOKstatic },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
441 { STCextern, TOKextern },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
442 { STCconst, TOKconst },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
443 { STCfinal, TOKfinal },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
444 { STCabstract, TOKabstract },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
445 { STCsynchronized, TOKsynchronized },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
446 { STCdeprecated, TOKdeprecated },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
447 { STCoverride, TOKoverride },
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
448 { STClazy, TOKlazy },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
449 { STCalias, TOKalias },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
450 { STCout, TOKout },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
451 { STCin, TOKin },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
452 #if DMDV2
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
453 { STCimmutable, TOKimmutable },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
454 { STCshared, TOKshared },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
455 { STCnothrow, TOKnothrow },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
456 { STCpure, TOKpure },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
457 { STCref, TOKref },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
458 { STCtls, TOKtls },
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
459 { STCgshared, TOKgshared },
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
460 { STCproperty, TOKat },
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
461 { STCsafe, TOKat },
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
462 { STCtrusted, TOKat },
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
463 { STCdisable, TOKat },
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
464 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
465 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
466
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
467 for (int i = 0; i < sizeof(table)/sizeof(table[0]); i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
468 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
469 if (stc & table[i].stc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
470 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
471 buf->writestring(Token::toChars(table[i].tok));
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
472 buf->writeByte(' ');
159
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 }
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
475 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
476
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
477 void StorageClassDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
478 {
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
479 stcToCBuffer(buf, stc);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
480 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
481 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
482
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
483 /********************************* LinkDeclaration ****************************/
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 LinkDeclaration::LinkDeclaration(enum LINK p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
486 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
487 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
488 //printf("LinkDeclaration(linkage = %d, decl = %p)\n", p, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
489 linkage = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
490 }
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 Dsymbol *LinkDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
493 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
494 LinkDeclaration *ld;
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 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
497 ld = new LinkDeclaration(linkage, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
498 return ld;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
499 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
500
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
501 void LinkDeclaration::setScope(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
502 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
503 //printf("LinkDeclaration::setScope(linkage = %d, decl = %p)\n", linkage, decl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
504 if (decl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
505 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
506 setScopeNewSc(sc, sc->stc, linkage, sc->protection, sc->explicitProtection, sc->structalign);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
507 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
508 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
509
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
510 void LinkDeclaration::semantic(Scope *sc)
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 //printf("LinkDeclaration::semantic(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
513 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
514 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
515 semanticNewSc(sc, sc->stc, linkage, sc->protection, sc->explicitProtection, sc->structalign);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
516 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
517 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
518
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
519 void LinkDeclaration::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
520 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
521 //printf("LinkDeclaration::semantic3(linkage = %d, decl = %p)\n", linkage, decl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
522 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
523 { enum LINK linkage_save = sc->linkage;
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 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
526 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
527 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
528 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
529
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
530 s->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
531 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
532 sc->linkage = linkage_save;
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
535 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
536 sc->linkage = linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
537 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
538 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
539
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
540 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
541 { const char *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
542
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
543 switch (linkage)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
544 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
545 case LINKd: p = "D"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
546 case LINKc: p = "C"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
547 case LINKcpp: p = "C++"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
548 case LINKwindows: p = "Windows"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
549 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
550
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
551 // LDC
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 716
diff changeset
552 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
553
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
554 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
555 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
556 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
557 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
558 buf->writestring("extern (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
559 buf->writestring(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
560 buf->writestring(") ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
561 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
562 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
563
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
564 char *LinkDeclaration::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
565 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
566 return (char *)"extern ()";
159
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
569 /********************************* ProtDeclaration ****************************/
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 ProtDeclaration::ProtDeclaration(enum PROT p, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
572 : AttribDeclaration(decl)
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 protection = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
575 //printf("decl = %p\n", 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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
578 Dsymbol *ProtDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
579 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
580 ProtDeclaration *pd;
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 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
583 pd = new ProtDeclaration(protection, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
584 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
585 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
586
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
587 void ProtDeclaration::setScope(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
588 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
589 if (decl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
590 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
591 setScopeNewSc(sc, sc->stc, sc->linkage, protection, 1, sc->structalign);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
592 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
593 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
594
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
595 void ProtDeclaration::importAll(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
596 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
597 Scope *newsc = sc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
598 if (sc->protection != protection ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
599 sc->explicitProtection != 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
600 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
601 // create new one for changes
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
602 newsc = new Scope(*sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
603 newsc->flags &= ~SCOPEfree;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
604 newsc->protection = protection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
605 newsc->explicitProtection = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
606 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
607
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
608 for (int i = 0; i < decl->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
609 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
610 Dsymbol *s = (Dsymbol *)decl->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
611 s->importAll(newsc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
612 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
613
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
614 if (newsc != sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
615 newsc->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
616 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
617
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
618 void ProtDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
619 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
620 if (decl)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
621 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
622 semanticNewSc(sc, sc->stc, sc->linkage, protection, 1, sc->structalign);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
623 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
624 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
625
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
626 void ProtDeclaration::protectionToCBuffer(OutBuffer *buf, enum PROT protection)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
627 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
628 const char *p;
159
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 switch (protection)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
631 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
632 case PROTprivate: p = "private"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
633 case PROTpackage: p = "package"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
634 case PROTprotected: p = "protected"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
635 case PROTpublic: p = "public"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
636 case PROTexport: p = "export"; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
637 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
638 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
639 break;
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 buf->writestring(p);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
642 buf->writeByte(' ');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
643 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
644
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
645 void ProtDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
646 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
647 protectionToCBuffer(buf, protection);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
648 AttribDeclaration::toCBuffer(buf, hgs);
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 /********************************* AlignDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
652
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
653 AlignDeclaration::AlignDeclaration(Loc loc, unsigned sa, Array *decl)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
654 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
655 {
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
656 this->loc = loc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
657 salign = sa;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
658 }
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 Dsymbol *AlignDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
661 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
662 AlignDeclaration *ad;
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 assert(!s);
710
20a5180f2e80 Make align(n), n != 1 an error.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
665 ad = new AlignDeclaration(loc, salign, Dsymbol::arraySyntaxCopy(decl));
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
666 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
667 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
668
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
669 void AlignDeclaration::setScope(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
670 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
671 //printf("\tAlignDeclaration::setScope '%s'\n",toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
672 if (decl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
673 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
674 setScopeNewSc(sc, sc->stc, sc->linkage, sc->protection, sc->explicitProtection, salign);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
675 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
676 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
677
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
678 void AlignDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
679 {
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
680 // 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
681 // 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
682 // other alignments are simply ignored. my tests show this is what llvm-gcc does too ...
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
683 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
684 semanticNewSc(sc, sc->stc, sc->linkage, sc->protection, sc->explicitProtection, salign);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
685 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
686 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
687
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
688
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
689 void AlignDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
690 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
691 buf->printf("align (%d)", salign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
692 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
693 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
694
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
695 /********************************* AnonDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
696
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
697 AnonDeclaration::AnonDeclaration(Loc loc, int isunion, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
698 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
699 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
700 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
701 this->isunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
702 this->sem = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
703 }
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 Dsymbol *AnonDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
706 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
707 AnonDeclaration *ad;
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 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
710 ad = new AnonDeclaration(loc, isunion, Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
711 return ad;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
714 void AnonDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
715 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
716 //printf("\tAnonDeclaration::semantic %s %p\n", isunion ? "union" : "struct", this);
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 Scope *scx = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
719 if (scope)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
720 { sc = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
721 scx = scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
722 scope = NULL;
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
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
725 unsigned dprogress_save = Module::dprogress;
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
726
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
727 assert(sc->parent);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
728
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
729 Dsymbol *parent = sc->parent->pastMixin();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
730 AggregateDeclaration *ad = parent->isAggregateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
731
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
732 if (!ad || (!ad->isStructDeclaration() && !ad->isClassDeclaration()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
733 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
734 error("can only be a part of an aggregate");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
735 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
736 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
737
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
738 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
739 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
740 AnonymousAggregateDeclaration aad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
741 int adisunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
742
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
743 if (sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
744 { ad = sc->anonAgg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
745 adisunion = sc->inunion;
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
748 adisunion = ad->isUnionDeclaration() != NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
749
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
750 // printf("\tsc->anonAgg = %p\n", sc->anonAgg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
751 // printf("\tad = %p\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
752 // printf("\taad = %p\n", &aad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
753
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
754 sc = sc->push();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
755 sc->anonAgg = &aad;
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
756 sc->stc &= ~(STCauto | STCscope | STCstatic | STCtls | STCgshared);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
757 sc->inunion = isunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
758 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
759 sc->flags = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
760 aad.structalign = sc->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
761 aad.parent = ad;
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 816
diff changeset
762
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
763 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
764 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
765 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
766
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
767 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
768 if (isunion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
769 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
770 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
771 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
772 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
773 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
774 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
775 sc = sc->pop();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
776
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
777 // If failed due to forward references, unwind and try again later
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
778 if (aad.sizeok == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
779 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
780 ad->sizeok = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
781 //printf("\tsetting ad->sizeok %p to 2\n", ad);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
782 if (!sc->anonAgg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
783 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
784 scope = scx ? scx : new Scope(*sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
785 scope->setNoFree();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
786 scope->module->addDeferredSemantic(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
787 }
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
788 Module::dprogress = dprogress_save;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
789 //printf("\tforward reference %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
790 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
791 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
792 if (sem == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
793 { Module::dprogress++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
794 sem = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
795 //printf("\tcompleted %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
796 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
797 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
798 ;//printf("\talready completed %p\n", this);
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 // 0 sized structs are set to 1 byte
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
801 if (aad.structsize == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
802 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
803 aad.structsize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
804 aad.alignsize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
805 }
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 // Align size of anonymous aggregate
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
808 //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
809 ad->alignmember(aad.structalign, aad.alignsize, &sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
810 //ad->structsize = sc->offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
811 //printf("sc->offset = %d\n", sc->offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
812
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
813 // 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
814 //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
815 for (unsigned i = 0; i < aad.fields.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
816 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
817 VarDeclaration *v = (VarDeclaration *)aad.fields.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
818
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
819 #if IN_LLVM
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
820 v->offset2 = sc->offset;
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
821 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
822 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
823
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
824 #if IN_LLVM
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
825 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
826 v->anonDecl = this;
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
827 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
828 ad->fields.push(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
829 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
830
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
831 // Add size of aad to ad
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
832 if (adisunion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
833 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
834 if (aad.structsize > ad->structsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
835 ad->structsize = aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
836 sc->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
837 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
838 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
839 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
840 ad->structsize = sc->offset + aad.structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
841 sc->offset = ad->structsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
842 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
843
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
844 if (ad->alignsize < aad.alignsize)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
845 ad->alignsize = aad.alignsize;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
846 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
847 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
848
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 void AnonDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
851 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
852 buf->printf(isunion ? "union" : "struct");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
853 buf->writestring("\n{\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
854 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
855 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
856 for (unsigned i = 0; i < decl->dim; i++)
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 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
859
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
860 //buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
861 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
862 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
863 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
864 buf->writestring("}\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
865 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
866
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
867 const char *AnonDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
868 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
869 return (isunion ? "anonymous union" : "anonymous struct");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
870 }
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 /********************************* PragmaDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
873
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
874 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
875 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
876 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
877
44f08170f4ef Removed tango from the repository and instead added a runtime 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 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
879 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
880 {
44f08170f4ef Removed tango from the repository and instead added a runtime 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 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
882 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
883 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
884 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
885 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
886 }
44f08170f4ef Removed tango from the repository and instead added a runtime 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
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
888 PragmaDeclaration::PragmaDeclaration(Loc loc, Identifier *ident, Expressions *args, Array *decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
889 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
890 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
891 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
892 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
893 this->args = args;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
894 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
895
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
896 Dsymbol *PragmaDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
897 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
898 //printf("PragmaDeclaration::syntaxCopy(%s)\n", toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
899 PragmaDeclaration *pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
900
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
901 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
902 pd = new PragmaDeclaration(loc, ident,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
903 Expression::arraySyntaxCopy(args), Dsymbol::arraySyntaxCopy(decl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
904 return pd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
905 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
906
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
907 void PragmaDeclaration::setScope(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
908 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
909 #if TARGET_NET
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
910 if (ident == Lexer::idPool("assembly"))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
911 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
912 if (!args || args->dim != 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
913 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
914 error("pragma has invalid number of arguments");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
915 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
916 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
917 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
918 Expression *e = (Expression *)args->data[0];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
919 e = e->semantic(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
920 e = e->optimize(WANTvalue | WANTinterpret);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
921 args->data[0] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
922 if (e->op != TOKstring)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
923 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
924 error("string expected, not '%s'", e->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
925 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
926 PragmaScope* pragma = new PragmaScope(this, sc->parent, static_cast<StringExp*>(e));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
927
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
928 assert(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
929 pragma->setScope(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
930
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
931 //add to module members
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
932 assert(sc->module);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
933 assert(sc->module->members);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
934 sc->module->members->push(pragma);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
935 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
936 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
937 #endif // TARGET_NET
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
938 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
939
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
940 void PragmaDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
941 { // Should be merged with PragmaStatement
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
942
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
943 #if IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
944 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
945 std::string arg1str;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
946
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
947 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
948
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
949 //printf("\tPragmaDeclaration::semantic '%s'\n",toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
950 if (ident == Id::msg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
951 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
952 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
953 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
954 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
955 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
956 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
957
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
958 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
959 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
960 if (e->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
961 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
962 StringExp *se = (StringExp *)e;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
963 fprintf(stdmsg, "%.*s", (int)se->len, (char *)se->string);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
964 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
965 else
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
966 fprintf(stdmsg, e->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
967 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
968 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
969 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
970 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
971 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
972 else if (ident == Id::lib)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
973 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
974 if (!args || args->dim != 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
975 error("string expected for library name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
976 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
977 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
978 Expression *e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
979
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
980 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
981 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
982 args->data[0] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
983 if (e->op != TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
984 error("string expected for library name, not '%s'", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
985 else if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
986 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
987 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
988 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
989 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
990 name[se->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
991 printf("library %s\n", name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
992 mem.free(name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
993 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
994 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
995 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
996 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
997 #if IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
998 else if (ident == Id::GNU_asm)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
999 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1000 if (! args || args->dim != 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1001 error("identifier and string expected for asm name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1002 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1003 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1004 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1005 Declaration *d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1006 StringExp *s = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1007
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1008 e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1009 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1010 if (e->op == TOKvar)
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 d = ((VarExp *)e)->var;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1013 if (! d->isFuncDeclaration() && ! d->isVarDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1014 d = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1015 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1016 if (!d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1017 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
1018
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1019 e = (Expression *)args->data[1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1020 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1021 e = e->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1022 if (e->op == TOKstring && ((StringExp *)e)->sz == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1023 s = ((StringExp *)e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1024 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1025 error("second argument of GNU_asm must be a char string");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1026
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1027 if (d && s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1028 d->c_ident = Lexer::idPool((char*) s->string);
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 goto Lnodecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1031 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1032 #endif
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1033 #if DMDV2
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1034 else if (ident == Id::startaddress)
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1035 {
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1036 if (!args || args->dim != 1)
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1037 error("function name expected for start address");
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1038 else
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1039 {
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1040 Expression *e = (Expression *)args->data[0];
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1041 e = e->semantic(sc);
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1042 e = e->optimize(WANTvalue | WANTinterpret);
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1043 args->data[0] = (void *)e;
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1044 Dsymbol *sa = getDsymbol(e);
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1045 if (!sa || !sa->isFuncDeclaration())
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1046 error("function name expected for start address, not '%s'", e->toChars());
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1047 }
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1048 goto Lnodecl;
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1049 }
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1050 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1051 #if TARGET_NET
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1052 else if (ident == Lexer::idPool("assembly"))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1053 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1054 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1055 #endif // TARGET_NET
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
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1057 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1058 #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
1059
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
1060 // 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
1061 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
1062 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1063 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
1064 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
1065 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
1066 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1067 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
1068 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
1069 }
44f08170f4ef Removed tango from the repository and instead added a runtime 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 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
1071 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1072
44f08170f4ef Removed tango from the repository and instead added a runtime 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 // 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
1074 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
1075 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1076 if (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
1077 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1078 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
1079 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
1080 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1081 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
1082 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1083
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1084 // 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
1085 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
1086 {
44f08170f4ef Removed tango from the repository and instead added a runtime 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 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
1088 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1089 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
1090 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
1091 }
44f08170f4ef Removed tango from the repository and instead added a runtime 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 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
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
44f08170f4ef Removed tango from the repository and instead added a runtime 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 // 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
1096 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
1097 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1098 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
1099 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1100 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
1101 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
1102 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1103 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
1104 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1105
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
1106 // 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
1107 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
1108 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1109 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
1110 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1111 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
1112 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
1113 }
44f08170f4ef Removed tango from the repository and instead added a runtime 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 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
1115 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1116
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1117 // 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
1118 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
1119 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1120 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
1121 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1122 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
1123 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1124 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1125 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
1126 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1127
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1128 // 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
1129 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
1130 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1131 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
1132 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1133 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
1134 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1135 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1136 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
1137 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1138
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
1139 // 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
1140 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
1141 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1142 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
1143 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1144 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
1145 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
1146 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1147 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
1148 }
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
1149
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1150 // pragma(ldc, "string") { templdecl(s) }
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1151 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
1152 {
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
1153 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
1154 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
1155 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
1156 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1157 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
1158 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
1159 }
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
1160 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
1161 {
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
1162 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
1163 }
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
1164 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
1165 {
1372
229e02867307 Fix format-string bugs by adding __attribute__((__format__)) in all applicable
Frits van Bommel <fvbommel wxs.nl>
parents: 1195
diff changeset
1166 error("command '%s' invalid", expr->toChars());
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
1167 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
1168 }
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
1169 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1170
1152
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1171 // 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
1172 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
1173 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1174 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
1175 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1176 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
1177 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1178 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1179 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
1180 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1181
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1182 #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
1183
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1184
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 876
diff changeset
1185 else if (ignoreUnsupportedPragmas)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1186 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1187 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1188 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1189 /* Print unrecognized pragmas
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1190 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1191 printf("pragma %s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1192 if (args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1193 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1194 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1195 {
1392
336faed34424 Allow ignored pragmas to have a body; don't ignore the body.
Frits van Bommel <fvbommel wxs.nl>
parents: 1372
diff changeset
1196 // ignore errors in ignored pragmas.
336faed34424 Allow ignored pragmas to have a body; don't ignore the body.
Frits van Bommel <fvbommel wxs.nl>
parents: 1372
diff changeset
1197 global.gag++;
336faed34424 Allow ignored pragmas to have a body; don't ignore the body.
Frits van Bommel <fvbommel wxs.nl>
parents: 1372
diff changeset
1198 unsigned errors_save = global.errors;
336faed34424 Allow ignored pragmas to have a body; don't ignore the body.
Frits van Bommel <fvbommel wxs.nl>
parents: 1372
diff changeset
1199
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1200 Expression *e = (Expression *)args->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1201 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1202 e = e->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1203 if (i == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1204 printf(" (");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1205 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1206 printf(",");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1207 printf("%s", e->toChars());
1392
336faed34424 Allow ignored pragmas to have a body; don't ignore the body.
Frits van Bommel <fvbommel wxs.nl>
parents: 1372
diff changeset
1208
336faed34424 Allow ignored pragmas to have a body; don't ignore the body.
Frits van Bommel <fvbommel wxs.nl>
parents: 1372
diff changeset
1209 // restore error state.
336faed34424 Allow ignored pragmas to have a body; don't ignore the body.
Frits van Bommel <fvbommel wxs.nl>
parents: 1372
diff changeset
1210 global.gag--;
336faed34424 Allow ignored pragmas to have a body; don't ignore the body.
Frits van Bommel <fvbommel wxs.nl>
parents: 1372
diff changeset
1211 global.errors = errors_save;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1212 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1213 if (args->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1214 printf(")");
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 printf("\n");
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1219 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1220 error("unrecognized pragma(%s)", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1221
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1222 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1223 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1224 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1225 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1226 Dsymbol *s = (Dsymbol *)decl->data[i];
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 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
1229
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1230 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1231 #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
1232
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1233 if (llvm_internal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1234 {
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
1235 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
1236 {
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1237 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
1238 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
1239 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1240 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
1241 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1242 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
1243 if (FuncDeclaration* fd = s->isFuncDeclaration())
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1244 {
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
1245 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
1246 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
1247 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
1248 ((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
1249 }
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1250 else if (TemplateDeclaration* td = s->isTemplateDeclaration())
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1251 {
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1252 td->llvmInternal = llvm_internal;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1253 td->intrinsicName = arg1str;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1254 }
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
1255 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
1256 {
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1257 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
1258 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
1259 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1260 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
1261
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1262 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
1263 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
1264 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
1265 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1266 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
1267 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1268 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
1269 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1270 }
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
1271 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
1272 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1273 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
1274 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1275 }
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
1276 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
1277 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1278 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
1279 fatal();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1280 }
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
1281 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
1282 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1283 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
1284 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1285 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
1286 fatal();
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1287 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1288 break;
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1289
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1290 case LLVMva_copy:
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1291 case LLVMva_end:
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1292 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
1293 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1294 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
1295 }
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1296 else
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1297 {
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1298 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
1299 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
1300 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1301 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1302
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
1303 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
1304 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
1305 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1306
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
1307 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
1308 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
1309 {
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1310 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
1311 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1312 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
1313 {
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
1314 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
1315 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
1316 }
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1317 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1318
1152
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1319 case LLVMinline_asm:
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1320 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
1321 {
1153
4454126b4345 Added support for single D type register return from __asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1152
diff changeset
1322 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
1323 {
1153
4454126b4345 Added support for single D type register return from __asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1152
diff changeset
1324 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
1325 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1326 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1327 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
1328 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1329 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
1330 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1331 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1332 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
1333 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1334 else
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1335 {
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1336 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
1337 fatal();
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1338 }
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1339 break;
521dd1626d76 Added initial support for raw LLVM inline asm.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
1340
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
1341 default:
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1342 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
1343 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1344 }
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
1345
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1346 #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
1347
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1348 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1349 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1350 return;
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 Lnodecl:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1353 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1354 error("pragma is missing closing ';'");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1355 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1356
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1357 int PragmaDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1358 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1359 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1360 return TRUE;
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
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1363 const char *PragmaDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1364 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1365 return "pragma";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1366 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1367
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
1368 #if IN_DMD
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1369 void PragmaDeclaration::toObjFile(int multiobj)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1370 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1371 if (ident == Id::lib)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1372 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1373 assert(args && args->dim == 1);
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 Expression *e = (Expression *)args->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1376
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1377 assert(e->op == TOKstring);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1378
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1379 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1380 char *name = (char *)mem.malloc(se->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1381 memcpy(name, se->string, se->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1382 name[se->len] = 0;
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1383 #if OMFOBJ
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1384 /* The OMF format allows library names to be inserted
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1385 * into the object file. The linker will then automatically
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1386 * search that library, too.
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1387 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1388 obj_includelib(name);
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1389 #elif ELFOBJ || MACHOBJ
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1390 /* The format does not allow embedded library names,
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1391 * so instead append the library name to the list to be passed
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1392 * to the linker.
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1393 */
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1394 global.params.libfiles->push((void *) name);
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1395 #else
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1396 error("pragma lib not supported");
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1602
diff changeset
1397 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1398 }
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1399 #if DMDV2
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1400 else if (ident == Id::startaddress)
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1401 {
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1402 assert(args && args->dim == 1);
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1403 Expression *e = (Expression *)args->data[0];
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1404 Dsymbol *sa = getDsymbol(e);
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1405 FuncDeclaration *f = sa->isFuncDeclaration();
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1406 assert(f);
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1407 Symbol *s = f->toSymbol();
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1408 obj_startaddress(s);
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1409 }
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1153
diff changeset
1410 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1411 AttribDeclaration::toObjFile(multiobj);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1412 }
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
1413 #endif
159
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 void PragmaDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
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 buf->printf("pragma(%s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1418 if (args)
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 for (size_t i = 0; i < args->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1421 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1422 Expression *e = (Expression *)args->data[i];
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 buf->writestring(", ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1425 e->toCBuffer(buf, hgs);
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 }
1602
a413ae7329bf Merge DMD r243: some harmonization with D2 dmd
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1428 buf->writeByte(')');
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1429 AttribDeclaration::toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1430 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1431
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1432
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1433 /********************************* ConditionalDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1434
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1435 ConditionalDeclaration::ConditionalDeclaration(Condition *condition, Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1436 : AttribDeclaration(decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1437 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1438 //printf("ConditionalDeclaration::ConditionalDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1439 this->condition = condition;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1440 this->elsedecl = elsedecl;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1443 Dsymbol *ConditionalDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1444 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1445 ConditionalDeclaration *dd;
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 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1448 dd = new ConditionalDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1449 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1450 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1451 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1452 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1453
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1454
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1455 int ConditionalDeclaration::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1456 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1457 //printf("ConditionalDeclaration::oneMember(), inc = %d\n", condition->inc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1458 if (condition->inc)
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 Array *d = condition->include(NULL, NULL) ? decl : elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1461 return Dsymbol::oneMembers(d, ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1462 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1463 *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1464 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1465 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1466
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1467 void ConditionalDeclaration::emitComment(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1468 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1469 //printf("ConditionalDeclaration::emitComment(sc = %p)\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1470 if (condition->inc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1471 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1472 AttribDeclaration::emitComment(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1473 }
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1474 else if (sc->docbuf)
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1475 {
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1476 /* 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
1477 * 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
1478 */
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1479 Array *d = decl ? decl : elsedecl;
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1480 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
1481 { Dsymbol *s = (Dsymbol *)d->data[i];
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1482 s->emitComment(sc);
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1483 }
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
1484 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1485 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1486
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1487 // Decide if 'then' or 'else' code should be included
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1488
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1489 Array *ConditionalDeclaration::include(Scope *sc, ScopeDsymbol *sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1490 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1491 //printf("ConditionalDeclaration::include()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1492 assert(condition);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1493 return condition->include(sc, sd) ? decl : elsedecl;
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
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1496 void ConditionalDeclaration::setScope(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1497 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1498 Array *d = include(sc, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1499
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1500 //printf("\tConditionalDeclaration::setScope '%s', d = %p\n",toChars(), d);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1501 if (d)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1502 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1503 for (unsigned i = 0; i < d->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1504 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1505 Dsymbol *s = (Dsymbol *)d->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1506
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1507 s->setScope(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1508 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1509 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1510 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1511
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1512 void ConditionalDeclaration::importAll(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1513 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1514 Array *d = include(sc, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1515
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1516 //printf("\tConditionalDeclaration::importAll '%s', d = %p\n",toChars(), d);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1517 if (d)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1518 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1519 for (unsigned i = 0; i < d->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1520 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1521 Dsymbol *s = (Dsymbol *)d->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1522
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1523 s->importAll(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1524 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1525 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1526 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1527
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1528 void ConditionalDeclaration::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1529 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1530 /* Because addComment is called by the parser, if we called
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1531 * include() it would define a version before it was used.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1532 * 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
1533 * so that's the workaround.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1534 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1535
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1536 if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1537 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1538 Array *d = decl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1539
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1540 for (int j = 0; j < 2; j++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1541 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1542 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1543 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1544 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1545 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1546
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1547 s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1548 //printf("ConditionalDeclaration::addComment %s\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1549 s->addComment(comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1550 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1551 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1552 d = elsedecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1553 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1554 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1555 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1556
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1557 void ConditionalDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1558 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1559 condition->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1560 if (decl || elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1561 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1562 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1563 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1564 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1565 if (decl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1566 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1567 for (unsigned i = 0; i < decl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1568 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1569 Dsymbol *s = (Dsymbol *)decl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1570
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1571 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1572 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1573 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1574 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1575 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1576 if (elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1577 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1578 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1579 buf->writestring("else");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1580 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1581 buf->writeByte('{');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1582 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1583 for (unsigned i = 0; i < elsedecl->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1584 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1585 Dsymbol *s = (Dsymbol *)elsedecl->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1586
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1587 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1588 s->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1589 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1590 buf->writeByte('}');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1591 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1592 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1593 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1594 buf->writeByte(':');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1595 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1596 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1597
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1598 /***************************** StaticIfDeclaration ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1599
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1600 StaticIfDeclaration::StaticIfDeclaration(Condition *condition,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1601 Array *decl, Array *elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1602 : ConditionalDeclaration(condition, decl, elsedecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1603 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1604 //printf("StaticIfDeclaration::StaticIfDeclaration()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1605 sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1606 addisdone = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1607 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1608
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1609
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1610 Dsymbol *StaticIfDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1611 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1612 StaticIfDeclaration *dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1613
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1614 assert(!s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1615 dd = new StaticIfDeclaration(condition->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1616 Dsymbol::arraySyntaxCopy(decl),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1617 Dsymbol::arraySyntaxCopy(elsedecl));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1618 return dd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1619 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1620
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1621
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1622 int StaticIfDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1623 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1624 //printf("StaticIfDeclaration::addMember() '%s'\n",toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1625 /* This is deferred until semantic(), so that
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1626 * expressions in the condition can refer to declarations
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1627 * in the same scope, such as:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1628 *
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1629 * template Foo(int i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1630 * {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1631 * const int j = i + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1632 * static if (j == 3)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1633 * const int k;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1634 * }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1635 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1636 this->sd = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1637 int m = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1638
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1639 if (memnum == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1640 { m = AttribDeclaration::addMember(sc, sd, memnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1641 addisdone = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1642 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1643 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1644 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1645
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1646
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1647 void StaticIfDeclaration::importAll(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1648 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1649 // do not evaluate condition before semantic pass
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1650 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1651
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1652 void StaticIfDeclaration::setScope(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1653 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1654 // do not evaluate condition before semantic pass
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1655 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1392
diff changeset
1656
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1657 void StaticIfDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1658 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1659 Array *d = include(sc, sd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1660
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1661 //printf("\tStaticIfDeclaration::semantic '%s', d = %p\n",toChars(), d);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1662 if (d)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1663 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1664 if (!addisdone)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1665 { AttribDeclaration::addMember(sc, sd, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1666 addisdone = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1667 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1668
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1669 for (unsigned i = 0; i < d->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1670 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1671 Dsymbol *s = (Dsymbol *)d->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1672
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1673 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1674 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1675 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1676 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1677
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1678 const char *StaticIfDeclaration::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1679 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1680 return "static if";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1681 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1682
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1683
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1684 /***************************** CompileDeclaration *****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1685
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1686 CompileDeclaration::CompileDeclaration(Loc loc, Expression *exp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1687 : AttribDeclaration(NULL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1688 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1689 //printf("CompileDeclaration(loc = %d)\n", loc.linnum);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1690 this->loc = loc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1691 this->exp = exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1692 this->sd = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1693 this->compiled = 0;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1694 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1695
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1696 Dsymbol *CompileDeclaration::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1697 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1698 //printf("CompileDeclaration::syntaxCopy('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1699 CompileDeclaration *sc = new CompileDeclaration(loc, exp->syntaxCopy());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1700 return sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1701 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1702
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1703 int CompileDeclaration::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1704 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 986
diff changeset
1705 //printf("CompileDeclaration::addMember(sc = %p, memnum = %d)\n", sc, memnum);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1706 this->sd = sd;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1707 if (memnum == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1708 { /* No members yet, so parse the mixin now
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1709 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1710 compileIt(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1711 memnum |= AttribDeclaration::addMember(sc, sd, memnum);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1712 compiled = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1713 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1714 return memnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1715 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1716
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1717 void CompileDeclaration::compileIt(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1718 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1719 //printf("CompileDeclaration::compileIt(loc = %d)\n", loc.linnum);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1720 exp = exp->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1721 exp = resolveProperties(sc, exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1722 exp = exp->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1723 if (exp->op != TOKstring)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1724 { 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
1725 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1726 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1727 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1728 StringExp *se = (StringExp *)exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1729 se = se->toUTF8(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1730 Parser p(sc->module, (unsigned char *)se->string, se->len, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1731 p.loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1732 p.nextToken();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1733 decl = p.parseDeclDefs(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1734 if (p.token.value != TOKeof)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1735 exp->error("incomplete mixin declaration (%s)", se->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1736 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1737 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1738
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1739 void CompileDeclaration::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1740 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1741 //printf("CompileDeclaration::semantic()\n");
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1742
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1743 if (!compiled)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1744 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1745 compileIt(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1746 AttribDeclaration::addMember(sc, sd, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1747 compiled = 1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1748 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1749 AttribDeclaration::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1750 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1751
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1752 void CompileDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1753 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1754 buf->writestring("mixin(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1755 exp->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1756 buf->writestring(");");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1757 buf->writenl();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 94
diff changeset
1758 }