statement.h revision 1.1.1.2 1 1.1 mrg
2 1.1 mrg /* Compiler implementation of the D programming language
3 1.1 mrg * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved
4 1.1 mrg * written by Walter Bright
5 1.1 mrg * http://www.digitalmars.com
6 1.1 mrg * Distributed under the Boost Software License, Version 1.0.
7 1.1 mrg * http://www.boost.org/LICENSE_1_0.txt
8 1.1 mrg * https://github.com/dlang/dmd/blob/master/src/dmd/statement.h
9 1.1 mrg */
10 1.1 mrg
11 1.1 mrg #pragma once
12 1.1 mrg
13 1.1 mrg #include "root/root.h"
14 1.1 mrg
15 1.1 mrg #include "arraytypes.h"
16 1.1 mrg #include "dsymbol.h"
17 1.1 mrg #include "visitor.h"
18 1.1 mrg #include "tokens.h"
19 1.1 mrg
20 1.1 mrg struct OutBuffer;
21 1.1 mrg struct Scope;
22 1.1 mrg class Expression;
23 1.1 mrg class LabelDsymbol;
24 1.1 mrg class Identifier;
25 1.1 mrg class IfStatement;
26 1.1 mrg class ExpStatement;
27 1.1 mrg class DefaultStatement;
28 1.1 mrg class VarDeclaration;
29 1.1 mrg class Condition;
30 1.1 mrg class Module;
31 1.1 mrg struct Token;
32 1.1 mrg class ErrorStatement;
33 1.1 mrg class ReturnStatement;
34 1.1 mrg class CompoundStatement;
35 1.1 mrg class Parameter;
36 1.1 mrg class StaticAssert;
37 1.1 mrg class AsmStatement;
38 1.1 mrg class GotoStatement;
39 1.1 mrg class ScopeStatement;
40 1.1 mrg class TryCatchStatement;
41 1.1 mrg class TryFinallyStatement;
42 1.1 mrg class CaseStatement;
43 1.1 mrg class DefaultStatement;
44 1.1 mrg class LabelStatement;
45 1.1 mrg class StaticForeach;
46 1.1 mrg
47 1.1 mrg // Back end
48 1.1 mrg struct code;
49 1.1 mrg
50 1.1 mrg bool inferAggregate(ForeachStatement *fes, Scope *sc, Dsymbol *&sapply);
51 1.1 mrg bool inferApplyArgTypes(ForeachStatement *fes, Scope *sc, Dsymbol *&sapply);
52 1.1 mrg
53 1.1 mrg /* How a statement exits; this is returned by blockExit()
54 1.1 mrg */
55 1.1 mrg enum BE
56 1.1 mrg {
57 1.1 mrg BEnone = 0,
58 1.1 mrg BEfallthru = 1,
59 1.1 mrg BEthrow = 2,
60 1.1 mrg BEreturn = 4,
61 1.1 mrg BEgoto = 8,
62 1.1 mrg BEhalt = 0x10,
63 1.1 mrg BEbreak = 0x20,
64 1.1 mrg BEcontinue = 0x40,
65 1.1 mrg BEerrthrow = 0x80,
66 1.1 mrg BEany = (BEfallthru | BEthrow | BEreturn | BEgoto | BEhalt)
67 1.1 mrg };
68 1.1 mrg
69 1.1 mrg class Statement : public RootObject
70 1.1 mrg {
71 1.1 mrg public:
72 1.1 mrg Loc loc;
73 1.1 mrg
74 1.1 mrg Statement(Loc loc);
75 1.1 mrg virtual Statement *syntaxCopy();
76 1.1 mrg
77 1.1 mrg void print();
78 1.1 mrg const char *toChars();
79 1.1 mrg
80 1.1 mrg void error(const char *format, ...);
81 1.1 mrg void warning(const char *format, ...);
82 1.1 mrg void deprecation(const char *format, ...);
83 1.1 mrg virtual Statement *getRelatedLabeled() { return this; }
84 1.1 mrg virtual bool hasBreak();
85 1.1 mrg virtual bool hasContinue();
86 1.1 mrg bool usesEH();
87 1.1 mrg bool comeFrom();
88 1.1 mrg bool hasCode();
89 1.1 mrg virtual Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally);
90 1.1 mrg virtual Statements *flatten(Scope *sc);
91 1.1 mrg virtual Statement *last();
92 1.1 mrg
93 1.1 mrg // Avoid dynamic_cast
94 1.1 mrg virtual ErrorStatement *isErrorStatement() { return NULL; }
95 1.1 mrg virtual ScopeStatement *isScopeStatement() { return NULL; }
96 1.1 mrg virtual ExpStatement *isExpStatement() { return NULL; }
97 1.1 mrg virtual CompoundStatement *isCompoundStatement() { return NULL; }
98 1.1 mrg virtual ReturnStatement *isReturnStatement() { return NULL; }
99 1.1 mrg virtual IfStatement *isIfStatement() { return NULL; }
100 1.1 mrg virtual CaseStatement *isCaseStatement() { return NULL; }
101 1.1 mrg virtual DefaultStatement *isDefaultStatement() { return NULL; }
102 1.1 mrg virtual LabelStatement *isLabelStatement() { return NULL; }
103 1.1 mrg virtual GotoDefaultStatement *isGotoDefaultStatement() { return NULL; }
104 1.1 mrg virtual GotoCaseStatement *isGotoCaseStatement() { return NULL; }
105 1.1 mrg virtual BreakStatement *isBreakStatement() { return NULL; }
106 1.1 mrg virtual DtorExpStatement *isDtorExpStatement() { return NULL; }
107 1.1 mrg virtual ForwardingStatement *isForwardingStatement() { return NULL; }
108 1.1 mrg virtual void accept(Visitor *v) { v->visit(this); }
109 1.1 mrg };
110 1.1 mrg
111 1.1 mrg /** Any Statement that fails semantic() or has a component that is an ErrorExp or
112 1.1 mrg * a TypeError should return an ErrorStatement from semantic().
113 1.1 mrg */
114 1.1 mrg class ErrorStatement : public Statement
115 1.1 mrg {
116 1.1 mrg public:
117 1.1 mrg ErrorStatement();
118 1.1 mrg Statement *syntaxCopy();
119 1.1 mrg
120 1.1 mrg ErrorStatement *isErrorStatement() { return this; }
121 1.1 mrg void accept(Visitor *v) { v->visit(this); }
122 1.1 mrg };
123 1.1 mrg
124 1.1 mrg class PeelStatement : public Statement
125 1.1 mrg {
126 1.1 mrg public:
127 1.1 mrg Statement *s;
128 1.1 mrg
129 1.1 mrg PeelStatement(Statement *s);
130 1.1 mrg void accept(Visitor *v) { v->visit(this); }
131 1.1 mrg };
132 1.1 mrg
133 1.1 mrg class ExpStatement : public Statement
134 1.1 mrg {
135 1.1 mrg public:
136 1.1 mrg Expression *exp;
137 1.1 mrg
138 1.1 mrg ExpStatement(Loc loc, Expression *exp);
139 1.1 mrg ExpStatement(Loc loc, Dsymbol *s);
140 1.1 mrg static ExpStatement *create(Loc loc, Expression *exp);
141 1.1 mrg Statement *syntaxCopy();
142 1.1 mrg Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally);
143 1.1 mrg Statements *flatten(Scope *sc);
144 1.1 mrg
145 1.1 mrg ExpStatement *isExpStatement() { return this; }
146 1.1 mrg void accept(Visitor *v) { v->visit(this); }
147 1.1 mrg };
148 1.1 mrg
149 1.1 mrg class DtorExpStatement : public ExpStatement
150 1.1 mrg {
151 1.1 mrg public:
152 1.1 mrg /* Wraps an expression that is the destruction of 'var'
153 1.1 mrg */
154 1.1 mrg
155 1.1 mrg VarDeclaration *var;
156 1.1 mrg
157 1.1 mrg DtorExpStatement(Loc loc, Expression *exp, VarDeclaration *v);
158 1.1 mrg Statement *syntaxCopy();
159 1.1 mrg void accept(Visitor *v) { v->visit(this); }
160 1.1 mrg
161 1.1 mrg DtorExpStatement *isDtorExpStatement() { return this; }
162 1.1 mrg };
163 1.1 mrg
164 1.1 mrg class CompileStatement : public Statement
165 1.1 mrg {
166 1.1 mrg public:
167 1.1 mrg Expression *exp;
168 1.1 mrg
169 1.1 mrg CompileStatement(Loc loc, Expression *exp);
170 1.1 mrg Statement *syntaxCopy();
171 1.1 mrg Statements *flatten(Scope *sc);
172 1.1 mrg void accept(Visitor *v) { v->visit(this); }
173 1.1 mrg };
174 1.1 mrg
175 1.1 mrg class CompoundStatement : public Statement
176 1.1 mrg {
177 1.1 mrg public:
178 1.1 mrg Statements *statements;
179 1.1 mrg
180 1.1 mrg CompoundStatement(Loc loc, Statements *s);
181 1.1 mrg CompoundStatement(Loc loc, Statement *s1);
182 1.1 mrg CompoundStatement(Loc loc, Statement *s1, Statement *s2);
183 1.1 mrg static CompoundStatement *create(Loc loc, Statement *s1, Statement *s2);
184 1.1 mrg Statement *syntaxCopy();
185 1.1 mrg Statements *flatten(Scope *sc);
186 1.1 mrg ReturnStatement *isReturnStatement();
187 1.1 mrg Statement *last();
188 1.1 mrg
189 1.1 mrg CompoundStatement *isCompoundStatement() { return this; }
190 1.1 mrg void accept(Visitor *v) { v->visit(this); }
191 1.1 mrg };
192 1.1 mrg
193 1.1 mrg class CompoundDeclarationStatement : public CompoundStatement
194 1.1 mrg {
195 1.1 mrg public:
196 1.1 mrg CompoundDeclarationStatement(Loc loc, Statements *s);
197 1.1 mrg Statement *syntaxCopy();
198 1.1 mrg void accept(Visitor *v) { v->visit(this); }
199 1.1 mrg };
200 1.1 mrg
201 1.1 mrg /* The purpose of this is so that continue will go to the next
202 1.1 mrg * of the statements, and break will go to the end of the statements.
203 1.1 mrg */
204 1.1 mrg class UnrolledLoopStatement : public Statement
205 1.1 mrg {
206 1.1 mrg public:
207 1.1 mrg Statements *statements;
208 1.1 mrg
209 1.1 mrg UnrolledLoopStatement(Loc loc, Statements *statements);
210 1.1 mrg Statement *syntaxCopy();
211 1.1 mrg bool hasBreak();
212 1.1 mrg bool hasContinue();
213 1.1 mrg
214 1.1 mrg void accept(Visitor *v) { v->visit(this); }
215 1.1 mrg };
216 1.1 mrg
217 1.1 mrg class ScopeStatement : public Statement
218 1.1 mrg {
219 1.1 mrg public:
220 1.1 mrg Statement *statement;
221 1.1 mrg Loc endloc; // location of closing curly bracket
222 1.1 mrg
223 1.1 mrg ScopeStatement(Loc loc, Statement *s, Loc endloc);
224 1.1 mrg Statement *syntaxCopy();
225 1.1 mrg ScopeStatement *isScopeStatement() { return this; }
226 1.1 mrg ReturnStatement *isReturnStatement();
227 1.1 mrg bool hasBreak();
228 1.1 mrg bool hasContinue();
229 1.1 mrg
230 1.1 mrg void accept(Visitor *v) { v->visit(this); }
231 1.1 mrg };
232 1.1 mrg
233 1.1 mrg class ForwardingStatement : public Statement
234 1.1 mrg {
235 1.1.1.2 mrg public:
236 1.1 mrg ForwardingScopeDsymbol *sym;
237 1.1 mrg Statement *statement;
238 1.1 mrg
239 1.1.1.2 mrg ForwardingStatement(Loc loc, ForwardingScopeDsymbol *sym, Statement *s);
240 1.1.1.2 mrg ForwardingStatement(Loc loc, Statement *s);
241 1.1 mrg Statement *syntaxCopy();
242 1.1 mrg Statements *flatten(Scope *sc);
243 1.1 mrg ForwardingStatement *isForwardingStatement() { return this; }
244 1.1 mrg void accept(Visitor *v) { v->visit(this); }
245 1.1 mrg };
246 1.1 mrg
247 1.1 mrg class WhileStatement : public Statement
248 1.1 mrg {
249 1.1 mrg public:
250 1.1 mrg Expression *condition;
251 1.1 mrg Statement *_body;
252 1.1 mrg Loc endloc; // location of closing curly bracket
253 1.1 mrg
254 1.1 mrg WhileStatement(Loc loc, Expression *c, Statement *b, Loc endloc);
255 1.1 mrg Statement *syntaxCopy();
256 1.1 mrg bool hasBreak();
257 1.1 mrg bool hasContinue();
258 1.1 mrg
259 1.1 mrg void accept(Visitor *v) { v->visit(this); }
260 1.1 mrg };
261 1.1 mrg
262 1.1 mrg class DoStatement : public Statement
263 1.1 mrg {
264 1.1 mrg public:
265 1.1 mrg Statement *_body;
266 1.1 mrg Expression *condition;
267 1.1 mrg Loc endloc; // location of ';' after while
268 1.1 mrg
269 1.1 mrg DoStatement(Loc loc, Statement *b, Expression *c, Loc endloc);
270 1.1 mrg Statement *syntaxCopy();
271 1.1 mrg bool hasBreak();
272 1.1 mrg bool hasContinue();
273 1.1 mrg
274 1.1 mrg void accept(Visitor *v) { v->visit(this); }
275 1.1 mrg };
276 1.1 mrg
277 1.1 mrg class ForStatement : public Statement
278 1.1 mrg {
279 1.1 mrg public:
280 1.1 mrg Statement *_init;
281 1.1 mrg Expression *condition;
282 1.1 mrg Expression *increment;
283 1.1 mrg Statement *_body;
284 1.1 mrg Loc endloc; // location of closing curly bracket
285 1.1 mrg
286 1.1 mrg // When wrapped in try/finally clauses, this points to the outermost one,
287 1.1 mrg // which may have an associated label. Internal break/continue statements
288 1.1 mrg // treat that label as referring to this loop.
289 1.1 mrg Statement *relatedLabeled;
290 1.1 mrg
291 1.1 mrg ForStatement(Loc loc, Statement *init, Expression *condition, Expression *increment, Statement *body, Loc endloc);
292 1.1 mrg Statement *syntaxCopy();
293 1.1 mrg Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally);
294 1.1 mrg Statement *getRelatedLabeled() { return relatedLabeled ? relatedLabeled : this; }
295 1.1 mrg bool hasBreak();
296 1.1 mrg bool hasContinue();
297 1.1 mrg
298 1.1 mrg void accept(Visitor *v) { v->visit(this); }
299 1.1 mrg };
300 1.1 mrg
301 1.1 mrg class ForeachStatement : public Statement
302 1.1 mrg {
303 1.1 mrg public:
304 1.1 mrg TOK op; // TOKforeach or TOKforeach_reverse
305 1.1 mrg Parameters *parameters; // array of Parameter*'s
306 1.1 mrg Expression *aggr;
307 1.1 mrg Statement *_body;
308 1.1 mrg Loc endloc; // location of closing curly bracket
309 1.1 mrg
310 1.1 mrg VarDeclaration *key;
311 1.1 mrg VarDeclaration *value;
312 1.1 mrg
313 1.1 mrg FuncDeclaration *func; // function we're lexically in
314 1.1 mrg
315 1.1 mrg Statements *cases; // put breaks, continues, gotos and returns here
316 1.1 mrg ScopeStatements *gotos; // forward referenced goto's go here
317 1.1 mrg
318 1.1 mrg ForeachStatement(Loc loc, TOK op, Parameters *parameters, Expression *aggr, Statement *body, Loc endloc);
319 1.1 mrg Statement *syntaxCopy();
320 1.1 mrg bool checkForArgTypes();
321 1.1 mrg bool hasBreak();
322 1.1 mrg bool hasContinue();
323 1.1 mrg
324 1.1 mrg void accept(Visitor *v) { v->visit(this); }
325 1.1 mrg };
326 1.1 mrg
327 1.1 mrg class ForeachRangeStatement : public Statement
328 1.1 mrg {
329 1.1 mrg public:
330 1.1 mrg TOK op; // TOKforeach or TOKforeach_reverse
331 1.1 mrg Parameter *prm; // loop index variable
332 1.1 mrg Expression *lwr;
333 1.1 mrg Expression *upr;
334 1.1 mrg Statement *_body;
335 1.1 mrg Loc endloc; // location of closing curly bracket
336 1.1 mrg
337 1.1 mrg VarDeclaration *key;
338 1.1 mrg
339 1.1 mrg ForeachRangeStatement(Loc loc, TOK op, Parameter *prm,
340 1.1 mrg Expression *lwr, Expression *upr, Statement *body, Loc endloc);
341 1.1 mrg Statement *syntaxCopy();
342 1.1 mrg bool hasBreak();
343 1.1 mrg bool hasContinue();
344 1.1 mrg
345 1.1 mrg void accept(Visitor *v) { v->visit(this); }
346 1.1 mrg };
347 1.1 mrg
348 1.1 mrg class IfStatement : public Statement
349 1.1 mrg {
350 1.1 mrg public:
351 1.1 mrg Parameter *prm;
352 1.1 mrg Expression *condition;
353 1.1 mrg Statement *ifbody;
354 1.1 mrg Statement *elsebody;
355 1.1 mrg Loc endloc; // location of closing curly bracket
356 1.1 mrg
357 1.1 mrg VarDeclaration *match; // for MatchExpression results
358 1.1 mrg
359 1.1 mrg IfStatement(Loc loc, Parameter *prm, Expression *condition, Statement *ifbody, Statement *elsebody, Loc endloc);
360 1.1 mrg Statement *syntaxCopy();
361 1.1 mrg IfStatement *isIfStatement() { return this; }
362 1.1 mrg
363 1.1 mrg void accept(Visitor *v) { v->visit(this); }
364 1.1 mrg };
365 1.1 mrg
366 1.1 mrg class ConditionalStatement : public Statement
367 1.1 mrg {
368 1.1 mrg public:
369 1.1 mrg Condition *condition;
370 1.1 mrg Statement *ifbody;
371 1.1 mrg Statement *elsebody;
372 1.1 mrg
373 1.1 mrg ConditionalStatement(Loc loc, Condition *condition, Statement *ifbody, Statement *elsebody);
374 1.1 mrg Statement *syntaxCopy();
375 1.1 mrg Statements *flatten(Scope *sc);
376 1.1 mrg
377 1.1 mrg void accept(Visitor *v) { v->visit(this); }
378 1.1 mrg };
379 1.1 mrg
380 1.1 mrg class StaticForeachStatement : public Statement
381 1.1 mrg {
382 1.1 mrg public:
383 1.1 mrg StaticForeach *sfe;
384 1.1 mrg
385 1.1.1.2 mrg StaticForeachStatement(Loc loc, StaticForeach *sfe);
386 1.1 mrg Statement *syntaxCopy();
387 1.1 mrg Statements *flatten(Scope *sc);
388 1.1 mrg
389 1.1 mrg void accept(Visitor *v) { v->visit(this); }
390 1.1 mrg };
391 1.1 mrg
392 1.1 mrg class PragmaStatement : public Statement
393 1.1 mrg {
394 1.1 mrg public:
395 1.1 mrg Identifier *ident;
396 1.1 mrg Expressions *args; // array of Expression's
397 1.1 mrg Statement *_body;
398 1.1 mrg
399 1.1 mrg PragmaStatement(Loc loc, Identifier *ident, Expressions *args, Statement *body);
400 1.1 mrg Statement *syntaxCopy();
401 1.1 mrg
402 1.1 mrg void accept(Visitor *v) { v->visit(this); }
403 1.1 mrg };
404 1.1 mrg
405 1.1 mrg class StaticAssertStatement : public Statement
406 1.1 mrg {
407 1.1 mrg public:
408 1.1 mrg StaticAssert *sa;
409 1.1 mrg
410 1.1 mrg StaticAssertStatement(StaticAssert *sa);
411 1.1 mrg Statement *syntaxCopy();
412 1.1 mrg
413 1.1 mrg void accept(Visitor *v) { v->visit(this); }
414 1.1 mrg };
415 1.1 mrg
416 1.1 mrg class SwitchStatement : public Statement
417 1.1 mrg {
418 1.1 mrg public:
419 1.1 mrg Expression *condition;
420 1.1 mrg Statement *_body;
421 1.1 mrg bool isFinal;
422 1.1 mrg
423 1.1 mrg DefaultStatement *sdefault;
424 1.1 mrg TryFinallyStatement *tf;
425 1.1 mrg GotoCaseStatements gotoCases; // array of unresolved GotoCaseStatement's
426 1.1 mrg CaseStatements *cases; // array of CaseStatement's
427 1.1 mrg int hasNoDefault; // !=0 if no default statement
428 1.1 mrg int hasVars; // !=0 if has variable case values
429 1.1 mrg VarDeclaration *lastVar;
430 1.1 mrg
431 1.1 mrg SwitchStatement(Loc loc, Expression *c, Statement *b, bool isFinal);
432 1.1 mrg Statement *syntaxCopy();
433 1.1 mrg bool hasBreak();
434 1.1 mrg bool checkLabel();
435 1.1 mrg
436 1.1 mrg void accept(Visitor *v) { v->visit(this); }
437 1.1 mrg };
438 1.1 mrg
439 1.1 mrg class CaseStatement : public Statement
440 1.1 mrg {
441 1.1 mrg public:
442 1.1 mrg Expression *exp;
443 1.1 mrg Statement *statement;
444 1.1 mrg
445 1.1 mrg int index; // which case it is (since we sort this)
446 1.1 mrg VarDeclaration *lastVar;
447 1.1 mrg
448 1.1 mrg CaseStatement(Loc loc, Expression *exp, Statement *s);
449 1.1 mrg Statement *syntaxCopy();
450 1.1 mrg int compare(RootObject *obj);
451 1.1 mrg CaseStatement *isCaseStatement() { return this; }
452 1.1 mrg
453 1.1 mrg void accept(Visitor *v) { v->visit(this); }
454 1.1 mrg };
455 1.1 mrg
456 1.1 mrg
457 1.1 mrg class CaseRangeStatement : public Statement
458 1.1 mrg {
459 1.1 mrg public:
460 1.1 mrg Expression *first;
461 1.1 mrg Expression *last;
462 1.1 mrg Statement *statement;
463 1.1 mrg
464 1.1 mrg CaseRangeStatement(Loc loc, Expression *first, Expression *last, Statement *s);
465 1.1 mrg Statement *syntaxCopy();
466 1.1 mrg void accept(Visitor *v) { v->visit(this); }
467 1.1 mrg };
468 1.1 mrg
469 1.1 mrg
470 1.1 mrg class DefaultStatement : public Statement
471 1.1 mrg {
472 1.1 mrg public:
473 1.1 mrg Statement *statement;
474 1.1 mrg VarDeclaration *lastVar;
475 1.1 mrg
476 1.1 mrg DefaultStatement(Loc loc, Statement *s);
477 1.1 mrg Statement *syntaxCopy();
478 1.1 mrg DefaultStatement *isDefaultStatement() { return this; }
479 1.1 mrg
480 1.1 mrg void accept(Visitor *v) { v->visit(this); }
481 1.1 mrg };
482 1.1 mrg
483 1.1 mrg class GotoDefaultStatement : public Statement
484 1.1 mrg {
485 1.1 mrg public:
486 1.1 mrg SwitchStatement *sw;
487 1.1 mrg
488 1.1 mrg GotoDefaultStatement(Loc loc);
489 1.1 mrg Statement *syntaxCopy();
490 1.1 mrg GotoDefaultStatement *isGotoDefaultStatement() { return this; }
491 1.1 mrg
492 1.1 mrg void accept(Visitor *v) { v->visit(this); }
493 1.1 mrg };
494 1.1 mrg
495 1.1 mrg class GotoCaseStatement : public Statement
496 1.1 mrg {
497 1.1 mrg public:
498 1.1 mrg Expression *exp; // NULL, or which case to goto
499 1.1 mrg CaseStatement *cs; // case statement it resolves to
500 1.1 mrg
501 1.1 mrg GotoCaseStatement(Loc loc, Expression *exp);
502 1.1 mrg Statement *syntaxCopy();
503 1.1 mrg GotoCaseStatement *isGotoCaseStatement() { return this; }
504 1.1 mrg
505 1.1 mrg void accept(Visitor *v) { v->visit(this); }
506 1.1 mrg };
507 1.1 mrg
508 1.1 mrg class SwitchErrorStatement : public Statement
509 1.1 mrg {
510 1.1 mrg public:
511 1.1 mrg SwitchErrorStatement(Loc loc);
512 1.1 mrg
513 1.1 mrg void accept(Visitor *v) { v->visit(this); }
514 1.1 mrg };
515 1.1 mrg
516 1.1 mrg class ReturnStatement : public Statement
517 1.1 mrg {
518 1.1 mrg public:
519 1.1 mrg Expression *exp;
520 1.1 mrg size_t caseDim;
521 1.1 mrg
522 1.1 mrg ReturnStatement(Loc loc, Expression *exp);
523 1.1 mrg Statement *syntaxCopy();
524 1.1 mrg
525 1.1 mrg ReturnStatement *isReturnStatement() { return this; }
526 1.1 mrg void accept(Visitor *v) { v->visit(this); }
527 1.1 mrg };
528 1.1 mrg
529 1.1 mrg class BreakStatement : public Statement
530 1.1 mrg {
531 1.1 mrg public:
532 1.1 mrg Identifier *ident;
533 1.1 mrg
534 1.1 mrg BreakStatement(Loc loc, Identifier *ident);
535 1.1 mrg Statement *syntaxCopy();
536 1.1 mrg
537 1.1 mrg BreakStatement *isBreakStatement() { return this; }
538 1.1 mrg void accept(Visitor *v) { v->visit(this); }
539 1.1 mrg };
540 1.1 mrg
541 1.1 mrg class ContinueStatement : public Statement
542 1.1 mrg {
543 1.1 mrg public:
544 1.1 mrg Identifier *ident;
545 1.1 mrg
546 1.1 mrg ContinueStatement(Loc loc, Identifier *ident);
547 1.1 mrg Statement *syntaxCopy();
548 1.1 mrg
549 1.1 mrg void accept(Visitor *v) { v->visit(this); }
550 1.1 mrg };
551 1.1 mrg
552 1.1 mrg class SynchronizedStatement : public Statement
553 1.1 mrg {
554 1.1 mrg public:
555 1.1 mrg Expression *exp;
556 1.1 mrg Statement *_body;
557 1.1 mrg
558 1.1 mrg SynchronizedStatement(Loc loc, Expression *exp, Statement *body);
559 1.1 mrg Statement *syntaxCopy();
560 1.1 mrg bool hasBreak();
561 1.1 mrg bool hasContinue();
562 1.1 mrg
563 1.1 mrg void accept(Visitor *v) { v->visit(this); }
564 1.1 mrg };
565 1.1 mrg
566 1.1 mrg class WithStatement : public Statement
567 1.1 mrg {
568 1.1 mrg public:
569 1.1 mrg Expression *exp;
570 1.1 mrg Statement *_body;
571 1.1 mrg VarDeclaration *wthis;
572 1.1 mrg Loc endloc;
573 1.1 mrg
574 1.1 mrg WithStatement(Loc loc, Expression *exp, Statement *body, Loc endloc);
575 1.1 mrg Statement *syntaxCopy();
576 1.1 mrg
577 1.1 mrg void accept(Visitor *v) { v->visit(this); }
578 1.1 mrg };
579 1.1 mrg
580 1.1 mrg class TryCatchStatement : public Statement
581 1.1 mrg {
582 1.1 mrg public:
583 1.1 mrg Statement *_body;
584 1.1 mrg Catches *catches;
585 1.1 mrg
586 1.1 mrg TryCatchStatement(Loc loc, Statement *body, Catches *catches);
587 1.1 mrg Statement *syntaxCopy();
588 1.1 mrg bool hasBreak();
589 1.1 mrg
590 1.1 mrg void accept(Visitor *v) { v->visit(this); }
591 1.1 mrg };
592 1.1 mrg
593 1.1 mrg class Catch : public RootObject
594 1.1 mrg {
595 1.1 mrg public:
596 1.1 mrg Loc loc;
597 1.1 mrg Type *type;
598 1.1 mrg Identifier *ident;
599 1.1 mrg VarDeclaration *var;
600 1.1 mrg Statement *handler;
601 1.1 mrg
602 1.1 mrg // set if semantic processing errors
603 1.1 mrg bool errors;
604 1.1 mrg
605 1.1 mrg // was generated by the compiler,
606 1.1 mrg // wasn't present in source code
607 1.1 mrg bool internalCatch;
608 1.1 mrg
609 1.1 mrg Catch(Loc loc, Type *t, Identifier *id, Statement *handler);
610 1.1 mrg Catch *syntaxCopy();
611 1.1 mrg };
612 1.1 mrg
613 1.1 mrg class TryFinallyStatement : public Statement
614 1.1 mrg {
615 1.1 mrg public:
616 1.1 mrg Statement *_body;
617 1.1 mrg Statement *finalbody;
618 1.1 mrg
619 1.1 mrg TryFinallyStatement(Loc loc, Statement *body, Statement *finalbody);
620 1.1 mrg static TryFinallyStatement *create(Loc loc, Statement *body, Statement *finalbody);
621 1.1 mrg Statement *syntaxCopy();
622 1.1 mrg bool hasBreak();
623 1.1 mrg bool hasContinue();
624 1.1 mrg
625 1.1 mrg void accept(Visitor *v) { v->visit(this); }
626 1.1 mrg };
627 1.1 mrg
628 1.1 mrg class OnScopeStatement : public Statement
629 1.1 mrg {
630 1.1 mrg public:
631 1.1 mrg TOK tok;
632 1.1 mrg Statement *statement;
633 1.1 mrg
634 1.1 mrg OnScopeStatement(Loc loc, TOK tok, Statement *statement);
635 1.1 mrg Statement *syntaxCopy();
636 1.1 mrg Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally);
637 1.1 mrg
638 1.1 mrg void accept(Visitor *v) { v->visit(this); }
639 1.1 mrg };
640 1.1 mrg
641 1.1 mrg class ThrowStatement : public Statement
642 1.1 mrg {
643 1.1 mrg public:
644 1.1 mrg Expression *exp;
645 1.1 mrg // was generated by the compiler,
646 1.1 mrg // wasn't present in source code
647 1.1 mrg bool internalThrow;
648 1.1 mrg
649 1.1 mrg ThrowStatement(Loc loc, Expression *exp);
650 1.1 mrg Statement *syntaxCopy();
651 1.1 mrg
652 1.1 mrg void accept(Visitor *v) { v->visit(this); }
653 1.1 mrg };
654 1.1 mrg
655 1.1 mrg class DebugStatement : public Statement
656 1.1 mrg {
657 1.1 mrg public:
658 1.1 mrg Statement *statement;
659 1.1 mrg
660 1.1 mrg DebugStatement(Loc loc, Statement *statement);
661 1.1 mrg Statement *syntaxCopy();
662 1.1 mrg Statements *flatten(Scope *sc);
663 1.1 mrg void accept(Visitor *v) { v->visit(this); }
664 1.1 mrg };
665 1.1 mrg
666 1.1 mrg class GotoStatement : public Statement
667 1.1 mrg {
668 1.1 mrg public:
669 1.1 mrg Identifier *ident;
670 1.1 mrg LabelDsymbol *label;
671 1.1 mrg TryFinallyStatement *tf;
672 1.1 mrg OnScopeStatement *os;
673 1.1 mrg VarDeclaration *lastVar;
674 1.1 mrg
675 1.1 mrg GotoStatement(Loc loc, Identifier *ident);
676 1.1 mrg Statement *syntaxCopy();
677 1.1 mrg bool checkLabel();
678 1.1 mrg
679 1.1 mrg void accept(Visitor *v) { v->visit(this); }
680 1.1 mrg };
681 1.1 mrg
682 1.1 mrg class LabelStatement : public Statement
683 1.1 mrg {
684 1.1 mrg public:
685 1.1 mrg Identifier *ident;
686 1.1 mrg Statement *statement;
687 1.1 mrg TryFinallyStatement *tf;
688 1.1 mrg OnScopeStatement *os;
689 1.1 mrg VarDeclaration *lastVar;
690 1.1 mrg Statement *gotoTarget; // interpret
691 1.1 mrg
692 1.1 mrg bool breaks; // someone did a 'break ident'
693 1.1 mrg
694 1.1 mrg LabelStatement(Loc loc, Identifier *ident, Statement *statement);
695 1.1 mrg Statement *syntaxCopy();
696 1.1 mrg Statements *flatten(Scope *sc);
697 1.1 mrg Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally);
698 1.1 mrg
699 1.1 mrg LabelStatement *isLabelStatement() { return this; }
700 1.1 mrg
701 1.1 mrg void accept(Visitor *v) { v->visit(this); }
702 1.1 mrg };
703 1.1 mrg
704 1.1 mrg class LabelDsymbol : public Dsymbol
705 1.1 mrg {
706 1.1 mrg public:
707 1.1 mrg LabelStatement *statement;
708 1.1 mrg
709 1.1 mrg LabelDsymbol(Identifier *ident);
710 1.1 mrg static LabelDsymbol *create(Identifier *ident);
711 1.1 mrg LabelDsymbol *isLabel();
712 1.1 mrg void accept(Visitor *v) { v->visit(this); }
713 1.1 mrg };
714 1.1 mrg
715 1.1 mrg Statement* asmSemantic(AsmStatement *s, Scope *sc);
716 1.1 mrg
717 1.1 mrg class AsmStatement : public Statement
718 1.1 mrg {
719 1.1 mrg public:
720 1.1 mrg Token *tokens;
721 1.1 mrg
722 1.1 mrg AsmStatement(Loc loc, Token *tokens);
723 1.1 mrg Statement *syntaxCopy();
724 1.1 mrg void accept(Visitor *v) { v->visit(this); }
725 1.1 mrg };
726 1.1 mrg
727 1.1 mrg class InlineAsmStatement : public AsmStatement
728 1.1 mrg {
729 1.1 mrg public:
730 1.1 mrg code *asmcode;
731 1.1 mrg unsigned asmalign; // alignment of this statement
732 1.1 mrg unsigned regs; // mask of registers modified (must match regm_t in back end)
733 1.1 mrg bool refparam; // true if function parameter is referenced
734 1.1 mrg bool naked; // true if function is to be naked
735 1.1 mrg
736 1.1 mrg InlineAsmStatement(Loc loc, Token *tokens);
737 1.1 mrg Statement *syntaxCopy();
738 1.1 mrg void accept(Visitor *v) { v->visit(this); }
739 1.1 mrg };
740 1.1 mrg
741 1.1 mrg // A GCC asm statement - assembler instructions with D expression operands
742 1.1 mrg class GccAsmStatement : public AsmStatement
743 1.1 mrg {
744 1.1 mrg public:
745 1.1 mrg StorageClass stc; // attributes of the asm {} block
746 1.1 mrg Expression *insn; // string expression that is the template for assembler code
747 1.1 mrg Expressions *args; // input and output operands of the statement
748 1.1 mrg unsigned outputargs; // of the operands in 'args', the number of output operands
749 1.1 mrg Identifiers *names; // list of symbolic names for the operands
750 1.1 mrg Expressions *constraints; // list of string constants specifying constraints on operands
751 1.1 mrg Expressions *clobbers; // list of string constants specifying clobbers and scratch registers
752 1.1 mrg Identifiers *labels; // list of goto labels
753 1.1 mrg GotoStatements *gotos; // of the goto labels, the equivalent statements they represent
754 1.1 mrg
755 1.1 mrg GccAsmStatement(Loc loc, Token *tokens);
756 1.1 mrg Statement *syntaxCopy();
757 1.1 mrg void accept(Visitor *v) { v->visit(this); }
758 1.1 mrg };
759 1.1 mrg
760 1.1 mrg // a complete asm {} block
761 1.1 mrg class CompoundAsmStatement : public CompoundStatement
762 1.1 mrg {
763 1.1 mrg public:
764 1.1 mrg StorageClass stc; // postfix attributes like nothrow/pure/@trusted
765 1.1 mrg
766 1.1 mrg CompoundAsmStatement(Loc loc, Statements *s, StorageClass stc);
767 1.1 mrg CompoundAsmStatement *syntaxCopy();
768 1.1 mrg Statements *flatten(Scope *sc);
769 1.1 mrg
770 1.1 mrg void accept(Visitor *v) { v->visit(this); }
771 1.1 mrg };
772 1.1 mrg
773 1.1 mrg class ImportStatement : public Statement
774 1.1 mrg {
775 1.1 mrg public:
776 1.1 mrg Dsymbols *imports; // Array of Import's
777 1.1 mrg
778 1.1 mrg ImportStatement(Loc loc, Dsymbols *imports);
779 1.1 mrg Statement *syntaxCopy();
780 1.1 mrg
781 1.1 mrg void accept(Visitor *v) { v->visit(this); }
782 1.1 mrg };
783