annotate dmd/statement.h @ 650:aa6a0b7968f7

Added test case for bug #100 Removed dubious check for not emitting static private global in other modules without access. This should be handled properly somewhere else, it's causing unresolved global errors for stuff that should work (in MiniD)
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sun, 05 Oct 2008 17:28:15 +0200
parents 6aee82889553
children eef8ac26c66c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
2 // Compiler implementation of the D programming language
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
3 // Copyright (c) 1999-2008 by Digital Mars
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
4 // All Rights Reserved
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
5 // written by Walter Bright
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
6 // http://www.digitalmars.com
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
7 // License for redistribution is by either the Artistic License
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
9 // See the included readme.txt for details.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
10
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
11 #ifndef DMD_STATEMENT_H
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
12 #define DMD_STATEMENT_H
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
13
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
14 #ifdef __DMC__
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
15 #pragma once
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
16 #endif /* __DMC__ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
17
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
18 #include "root.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
19
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
20 #include "arraytypes.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
21 #include "dsymbol.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
22 #include "lexer.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
23
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
24 struct OutBuffer;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
25 struct Scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
26 struct Expression;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
27 struct LabelDsymbol;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
28 struct Identifier;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
29 struct IfStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
30 struct DeclarationStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
31 struct DefaultStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
32 struct VarDeclaration;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
33 struct Condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
34 struct Module;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
35 struct Token;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
36 struct InlineCostState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
37 struct InlineDoState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
38 struct InlineScanState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
39 struct ReturnStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
40 struct CompoundStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
41 struct Argument;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
42 struct StaticAssert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
43 struct AsmStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
44 struct AsmBlockStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
45 struct GotoStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
46 struct ScopeStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
47 struct TryCatchStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
48 struct TryFinallyStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
49 struct HdrGenState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
50 struct InterState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
51 struct CaseStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
52 struct LabelStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
53 struct VolatileStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
54 struct SynchronizedStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
55
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
56 enum TOK;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
57
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
58 namespace llvm
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
59 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
60 class Value;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
61 class BasicBlock;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
62 class ConstantInt;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
63 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
64
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
65 // Back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
66 struct IRState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
67 struct Blockx;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
68 #if IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
69 struct DValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
70 typedef DValue elem;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
71 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
72
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
73 #if IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
74 union tree_node; typedef union tree_node block;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
75 //union tree_node; typedef union tree_node elem;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
76 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
77 struct block;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
78 //struct elem;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
79 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
80 struct code;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
81
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
82 /* How a statement exits
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
83 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
84 enum BE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
85 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
86 BEnone = 0,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
87 BEfallthru = 1,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
88 BEthrow = 2,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
89 BEreturn = 4,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
90 BEgoto = 8,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
91 BEhalt = 0x10,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
92 BEbreak = 0x20,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
93 BEcontinue = 0x40,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
94 BEany = (BEfallthru | BEthrow | BEreturn | BEgoto | BEhalt),
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
95 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
96
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
97 // LLVMDC this is used for tracking try-finally, synchronized and volatile scopes
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
98 // definitions in gen/llvmhelpers.cpp
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
99 struct EnclosingHandler : Object
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
100 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
101 virtual void emitCode(IRState* p) = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
102 virtual EnclosingHandler* getEnclosing() = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
103 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
104 struct EnclosingTryFinally : EnclosingHandler
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
105 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
106 TryFinallyStatement* tf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
107 void emitCode(IRState* p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
108 EnclosingHandler* getEnclosing();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
109 EnclosingTryFinally(TryFinallyStatement* _tf) : tf(_tf) {}
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
110 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
111 struct EnclosingVolatile : EnclosingHandler
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
112 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
113 VolatileStatement* v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
114 void emitCode(IRState* p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
115 EnclosingHandler* getEnclosing();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
116 EnclosingVolatile(VolatileStatement* _tf) : v(_tf) {}
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
117 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
118 struct EnclosingSynchro : EnclosingHandler
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
119 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
120 SynchronizedStatement* s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
121 void emitCode(IRState* p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
122 EnclosingHandler* getEnclosing();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
123 EnclosingSynchro(SynchronizedStatement* _tf) : s(_tf) {}
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
124 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
125
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
126 struct Statement : Object
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
127 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
128 Loc loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
129
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
130 Statement(Loc loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
131 virtual Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
132
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
133 void print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
134 char *toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
135
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
136 void error(const char *format, ...);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
137 virtual void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
138 virtual TryCatchStatement *isTryCatchStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
139 virtual GotoStatement *isGotoStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
140 virtual AsmStatement *isAsmStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
141 virtual AsmBlockStatement *isAsmBlockStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
142 #ifdef _DH
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
143 int incontract;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
144 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
145 virtual ScopeStatement *isScopeStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
146 virtual Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
147 Statement *semanticScope(Scope *sc, Statement *sbreak, Statement *scontinue);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
148 virtual int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
149 virtual int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
150 virtual int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
151 virtual int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
152 virtual int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
153 virtual int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
154 virtual void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
155 virtual Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
156 virtual Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
157
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
158 virtual int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
159 virtual Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
160 virtual Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
161
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
162 // Back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
163 virtual void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
164
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
165 // Avoid dynamic_cast
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
166 virtual DeclarationStatement *isDeclarationStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
167 virtual CompoundStatement *isCompoundStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
168 virtual ReturnStatement *isReturnStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
169 virtual IfStatement *isIfStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
170 virtual CaseStatement* isCaseStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
171 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
172
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
173 struct ExpStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
174 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
175 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
176
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
177 ExpStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
178 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
179 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
180 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
181 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
182 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
183 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
184
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
185 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
186 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
187 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
188
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
189 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
190 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
191
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
192 struct CompileStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
193 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
194 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
195
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
196 CompileStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
197 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
198 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
199 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
200 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
201 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
202
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
203 struct DeclarationStatement : ExpStatement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
204 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
205 // Doing declarations as an expression, rather than a statement,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
206 // makes inlining functions much easier.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
207
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
208 DeclarationStatement(Loc loc, Dsymbol *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
209 DeclarationStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
210 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
211 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
212 void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
213
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
214 DeclarationStatement *isDeclarationStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
215 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
216
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
217 struct CompoundStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
218 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
219 Statements *statements;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
220
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
221 CompoundStatement(Loc loc, Statements *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
222 CompoundStatement(Loc loc, Statement *s1, Statement *s2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
223 virtual Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
224 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
225 virtual Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
226 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
227 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
228 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
229 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
230 virtual Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
231 ReturnStatement *isReturnStatement();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
232 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
233
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
234 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
235 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
236 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
237
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
238 virtual void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
239
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
240 virtual CompoundStatement *isCompoundStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
241 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
242
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
243 /* The purpose of this is so that continue will go to the next
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
244 * of the statements, and break will go to the end of the statements.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
245 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
246 struct UnrolledLoopStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
247 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
248 Statements *statements;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
249 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
250
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
251 UnrolledLoopStatement(Loc loc, Statements *statements);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
252 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
253 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
254 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
255 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
256 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
257 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
258 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
259 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
260 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
261 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
262
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
263 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
264 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
265 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
266
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
267 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
268 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
269
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
270 struct ScopeStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
271 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
272 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
273
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
274 ScopeStatement(Loc loc, Statement *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
275 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
276 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
277 ScopeStatement *isScopeStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
278 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
279 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
280 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
281 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
282 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
283 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
284 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
285 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
286
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
287 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
288
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
289 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
290 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
291
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
292 struct WhileStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
293 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
294 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
295 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
296 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
297
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
298 WhileStatement(Loc loc, Expression *c, Statement *b);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
299 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
300 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
301 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
302 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
303 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
304 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
305 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
306 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
307 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
308 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
309
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
310 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
311
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
312 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
313 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
314
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
315 struct DoStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
316 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
317 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
318 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
319 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
320
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
321 DoStatement(Loc loc, Statement *b, Expression *c);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
322 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
323 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
324 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
325 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
326 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
327 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
328 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
329 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
330 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
331 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
332
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
333 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
334
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
335 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
336 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
337
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
338 struct ForStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
339 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
340 Statement *init;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
341 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
342 Expression *increment;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
343 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
344 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
345
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
346 ForStatement(Loc loc, Statement *init, Expression *condition, Expression *increment, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
347 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
348 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
349 void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
350 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
351 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
352 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
353 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
354 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
355 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
356 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
357 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
358
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
359 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
360
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
361 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
362 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
363
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
364 struct ForeachStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
365 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
366 enum TOK op; // TOKforeach or TOKforeach_reverse
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
367 Arguments *arguments; // array of Argument*'s
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
368 Expression *aggr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
369 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
370 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
371
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
372 VarDeclaration *key;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
373 VarDeclaration *value;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
374
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
375 FuncDeclaration *func; // function we're lexically in
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
376
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
377 Array cases; // put breaks, continues, gotos and returns here
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
378 Array gotos; // forward referenced goto's go here
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
379
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
380 ForeachStatement(Loc loc, enum TOK op, Arguments *arguments, Expression *aggr, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
381 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
382 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
383 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
384 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
385 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
386 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
387 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
388 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
389 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
390 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
391
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
392 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
393
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
394 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
395 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
396
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
397 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
398 struct ForeachRangeStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
399 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
400 enum TOK op; // TOKforeach or TOKforeach_reverse
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
401 Argument *arg; // loop index variable
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
402 Expression *lwr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
403 Expression *upr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
404 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
405
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
406 VarDeclaration *key;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
407
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
408 ForeachRangeStatement(Loc loc, enum TOK op, Argument *arg,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
409 Expression *lwr, Expression *upr, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
410 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
411 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
412 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
413 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
414 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
415 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
416 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
417 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
418 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
419 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
420
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
421 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
422
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
423 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
424 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
425 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
426
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
427 struct IfStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
428 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
429 Argument *arg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
430 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
431 Statement *ifbody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
432 Statement *elsebody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
433
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
434 VarDeclaration *match; // for MatchExpression results
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
435
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
436 IfStatement(Loc loc, Argument *arg, Expression *condition, Statement *ifbody, Statement *elsebody);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
437 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
438 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
439 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
440 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
441 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
442 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
443 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
444 IfStatement *isIfStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
445
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
446 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
447 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
448 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
449
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
450 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
451 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
452
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
453 struct ConditionalStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
454 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
455 Condition *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
456 Statement *ifbody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
457 Statement *elsebody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
458
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
459 ConditionalStatement(Loc loc, Condition *condition, Statement *ifbody, Statement *elsebody);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
460 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
461 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
462 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
463 int usesEH();
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 356
diff changeset
464 int blockExit();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
465
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
466 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
467 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
468
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
469 struct PragmaStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
470 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
471 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
472 Expressions *args; // array of Expression's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
473 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
474
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
475 PragmaStatement(Loc loc, Identifier *ident, Expressions *args, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
476 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
477 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
478 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
479 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
480 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
481
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
482 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
483 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
484
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
485 struct StaticAssertStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
486 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
487 StaticAssert *sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
488
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
489 StaticAssertStatement(StaticAssert *sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
490 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
491 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
492
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
493 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
494 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
495
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
496 struct SwitchStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
497 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
498 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
499 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
500
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
501 DefaultStatement *sdefault;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
502 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
503
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
504 Array gotoCases; // array of unresolved GotoCaseStatement's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
505 Array *cases; // array of CaseStatement's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
506 int hasNoDefault; // !=0 if no default statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
507
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
508 SwitchStatement(Loc loc, Expression *c, Statement *b);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
509 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
510 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
511 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
512 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
513 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
514 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
515 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
516 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
517
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
518 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
519
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
520 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
521 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
522
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
523 struct CaseStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
524 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
525 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
526 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
527 int index; // which case it is (since we sort this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
528 block *cblock; // back end: label for the block
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
529
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
530 CaseStatement(Loc loc, Expression *exp, Statement *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
531 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
532 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
533 int compare(Object *obj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
534 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
535 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
536 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
537 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
538 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
539 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
540
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
541 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
542
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
543 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
544
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
545 CaseStatement* isCaseStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
546
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
547 // LLVMDC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
548 llvm::BasicBlock* bodyBB;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
549 llvm::ConstantInt* llvmIdx;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
550 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
551
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
552 struct DefaultStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
553 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
554 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
555 #if IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
556 block *cblock; // back end: label for the block
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
557 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
558
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
559 DefaultStatement(Loc loc, Statement *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
560 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
561 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
562 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
563 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
564 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
565 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
566 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
567 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
568
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
569 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
570
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
571 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
572
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
573 // LLVMDC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
574 llvm::BasicBlock* bodyBB;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
575 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
576
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
577 struct GotoDefaultStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
578 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
579 SwitchStatement *sw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
580 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
581
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
582 GotoDefaultStatement(Loc loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
583 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
584 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
585 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
586 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
587 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
588 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
589
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
590 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
591 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
592
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
593 struct GotoCaseStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
594 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
595 Expression *exp; // NULL, or which case to goto
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
596 CaseStatement *cs; // case statement it resolves to
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
597 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
598 SwitchStatement *sw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
599
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
600 GotoCaseStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
601 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
602 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
603 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
604 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
605 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
606 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
607
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
608 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
609 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
610
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
611 struct SwitchErrorStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
612 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
613 SwitchErrorStatement(Loc loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
614 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
615 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
616 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
617
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
618 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
619 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
620
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
621 struct ReturnStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
622 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
623 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
624 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
625
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
626 ReturnStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
627 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
628 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
629 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
630 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
631 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
632 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
633
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
634 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
635 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
636 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
637
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
638 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
639
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
640 ReturnStatement *isReturnStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
641 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
642
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
643 struct BreakStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
644 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
645 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
646 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
647
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
648 BreakStatement(Loc loc, Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
649 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
650 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
651 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
652 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
653 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
654 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
655
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
656 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
657
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
658 // LLVMDC: only set if ident is set: label statement to jump to
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
659 LabelStatement *target;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
660 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
661
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
662 struct ContinueStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
663 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
664 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
665 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
666
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
667 ContinueStatement(Loc loc, Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
668 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
669 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
670 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
671 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
672 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
673 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
674
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
675 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
676
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
677 // LLVMDC: only set if ident is set: label statement to jump to
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
678 LabelStatement *target;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
679 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
680
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
681 struct SynchronizedStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
682 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
683 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
684 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
685 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
686
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
687 SynchronizedStatement(Loc loc, Expression *exp, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
688 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
689 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
690 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
691 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
692 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
693 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
694 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
695 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
696
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
697 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
698
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
699 // Back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
700 elem *esync;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
701 SynchronizedStatement(Loc loc, elem *esync, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
702 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
703 llvm::Value* llsync;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
704 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
705
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
706 struct WithStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
707 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
708 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
709 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
710 VarDeclaration *wthis;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
711
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
712 WithStatement(Loc loc, Expression *exp, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
713 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
714 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
715 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
716 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
717 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
718 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
719
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
720 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
721
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
722 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
723 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
724
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
725 struct TryCatchStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
726 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
727 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
728 Array *catches;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
729
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
730 TryCatchStatement(Loc loc, Statement *body, Array *catches);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
731 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
732 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
733 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
734 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
735 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
736 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
737
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
738 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
739
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
740 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
741 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
742 TryCatchStatement *isTryCatchStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
743 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
744
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
745 struct Catch : Object
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
746 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
747 Loc loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
748 Type *type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
749 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
750 VarDeclaration *var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
751 Statement *handler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
752
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
753 Catch(Loc loc, Type *t, Identifier *id, Statement *handler);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
754 Catch *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
755 void semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
756 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
757 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
758 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
759
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
760 struct TryFinallyStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
761 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
762 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
763 Statement *finalbody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
764 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
765
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
766 TryFinallyStatement(Loc loc, Statement *body, Statement *finalbody);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
767 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
768 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
769 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
770 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
771 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
772 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
773 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
774 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
775
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
776 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
777
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
778 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
779 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
780
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
781 struct OnScopeStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
782 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
783 TOK tok;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
784 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
785
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
786 OnScopeStatement(Loc loc, TOK tok, Statement *statement);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
787 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
788 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
789 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
790 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
791 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
792 void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
793
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
794 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
795 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
796
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
797 struct ThrowStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
798 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
799 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
800
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
801 ThrowStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
802 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
803 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
804 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
805 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
806 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
807
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
808 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
809
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
810 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
811 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
812
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
813 struct VolatileStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
814 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
815 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
816 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
817
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
818 VolatileStatement(Loc loc, Statement *statement);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
819 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
820 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
821 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
822 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
823 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
824 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
825
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
826 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
827
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
828 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
829 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
830
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
831 struct GotoStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
832 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
833 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
834 LabelDsymbol *label;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
835 TryFinallyStatement *tf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
836 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
837
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
838 GotoStatement(Loc loc, Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
839 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
840 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
841 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
842 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
843 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
844
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
845 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
846 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
847 GotoStatement *isGotoStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
848 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
849
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
850 struct LabelStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
851 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
852 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
853 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
854 TryFinallyStatement *tf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
855 EnclosingHandler* enclosinghandler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
856 block *lblock; // back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
857 int isReturnLabel;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
858
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
859 LabelStatement(Loc loc, Identifier *ident, Statement *statement);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
860 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
861 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
862 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
863 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
864 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
865 int fallOffEnd();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
866 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
867 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
868 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
869
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
870 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
871
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
872 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
873
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
874 // LLVMDC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
875 bool asmLabel; // for labels inside inline assembler
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
876 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
877
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
878 struct LabelDsymbol : Dsymbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
879 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
880 LabelStatement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
881
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
882 LabelDsymbol(Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
883 LabelDsymbol *isLabel();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
884 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
885
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
886 struct AsmStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
887 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
888 Token *tokens;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
889 code *asmcode;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
890 unsigned asmalign; // alignment of this statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
891 unsigned refparam; // !=0 if function parameter is referenced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
892 unsigned naked; // !=0 if function is to be naked
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
893 unsigned regs; // mask of registers modified
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
894
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
895 AsmStatement(Loc loc, Token *tokens);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
896 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
897 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
898 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
899 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
900
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
901 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
902 virtual AsmStatement *isAsmStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
903
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
904 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
905
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
906 // LLVMDC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
907 // non-zero if this is a branch, contains the target labels identifier
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
908 Identifier* isBranchToLabel;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
909 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
910
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
911 struct AsmBlockStatement : CompoundStatement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
912 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
913 EnclosingHandler* enclosinghandler;
356
44daf304421c [svn r377] The previous check was too strict, it completely disallowed gotos within finally blocks. This reenables them as long as they don't cross a finally boundary.
ChristianK
parents: 353
diff changeset
914 TryFinallyStatement* tf;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
915
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
916 AsmBlockStatement(Loc loc, Statements *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
917 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
918 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
919 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
920
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
921 CompoundStatement *isCompoundStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
922 AsmBlockStatement *isAsmBlockStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
923
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
924 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
925 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
926
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
927 #endif /* DMD_STATEMENT_H */