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