statement.h revision 1.1 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 mrg ForwardingScopeDsymbol *sym;
236 1.1 mrg Statement *statement;
237 1.1 mrg
238 1.1 mrg Statement *syntaxCopy();
239 1.1 mrg Statement *getRelatedLabeled();
240 1.1 mrg bool hasBreak();
241 1.1 mrg bool hasContinue();
242 1.1 mrg Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexception, Statement **sfinally);
243 1.1 mrg Statement *last();
244 1.1 mrg Statements *flatten(Scope *sc);
245 1.1 mrg ForwardingStatement *isForwardingStatement() { return this; }
246 1.1 mrg void accept(Visitor *v) { v->visit(this); }
247 1.1 mrg };
248 1.1 mrg
249 1.1 mrg class WhileStatement : public Statement
250 1.1 mrg {
251 1.1 mrg public:
252 1.1 mrg Expression *condition;
253 1.1 mrg Statement *_body;
254 1.1 mrg Loc endloc; // location of closing curly bracket
255 1.1 mrg
256 1.1 mrg WhileStatement(Loc loc, Expression *c, Statement *b, Loc endloc);
257 1.1 mrg Statement *syntaxCopy();
258 1.1 mrg bool hasBreak();
259 1.1 mrg bool hasContinue();
260 1.1 mrg
261 1.1 mrg void accept(Visitor *v) { v->visit(this); }
262 1.1 mrg };
263 1.1 mrg
264 1.1 mrg class DoStatement : public Statement
265 1.1 mrg {
266 1.1 mrg public:
267 1.1 mrg Statement *_body;
268 1.1 mrg Expression *condition;
269 1.1 mrg Loc endloc; // location of ';' after while
270 1.1 mrg
271 1.1 mrg DoStatement(Loc loc, Statement *b, Expression *c, Loc endloc);
272 1.1 mrg Statement *syntaxCopy();
273 1.1 mrg bool hasBreak();
274 1.1 mrg bool hasContinue();
275 1.1 mrg
276 1.1 mrg void accept(Visitor *v) { v->visit(this); }
277 1.1 mrg };
278 1.1 mrg
279 1.1 mrg class ForStatement : public Statement
280 1.1 mrg {
281 1.1 mrg public:
282 1.1 mrg Statement *_init;
283 1.1 mrg Expression *condition;
284 1.1 mrg Expression *increment;
285 1.1 mrg Statement *_body;
286 1.1 mrg Loc endloc; // location of closing curly bracket
287 1.1 mrg
288 1.1 mrg // When wrapped in try/finally clauses, this points to the outermost one,
289 1.1 mrg // which may have an associated label. Internal break/continue statements
290 1.1 mrg // treat that label as referring to this loop.
291 1.1 mrg Statement *relatedLabeled;
292 1.1 mrg
293 1.1 mrg ForStatement(Loc loc, Statement *init, Expression *condition, Expression *increment, Statement *body, Loc endloc);
294 1.1 mrg Statement *syntaxCopy();
295 1.1 mrg Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally);
296 1.1 mrg Statement *getRelatedLabeled() { return relatedLabeled ? relatedLabeled : this; }
297 1.1 mrg bool hasBreak();
298 1.1 mrg bool hasContinue();
299 1.1 mrg
300 1.1 mrg void accept(Visitor *v) { v->visit(this); }
301 1.1 mrg };
302 1.1 mrg
303 1.1 mrg class ForeachStatement : public Statement
304 1.1 mrg {
305 1.1 mrg public:
306 1.1 mrg TOK op; // TOKforeach or TOKforeach_reverse
307 1.1 mrg Parameters *parameters; // array of Parameter*'s
308 1.1 mrg Expression *aggr;
309 1.1 mrg Statement *_body;
310 1.1 mrg Loc endloc; // location of closing curly bracket
311 1.1 mrg
312 1.1 mrg VarDeclaration *key;
313 1.1 mrg VarDeclaration *value;
314 1.1 mrg
315 1.1 mrg FuncDeclaration *func; // function we're lexically in
316 1.1 mrg
317 1.1 mrg Statements *cases; // put breaks, continues, gotos and returns here
318 1.1 mrg ScopeStatements *gotos; // forward referenced goto's go here
319 1.1 mrg
320 1.1 mrg ForeachStatement(Loc loc, TOK op, Parameters *parameters, Expression *aggr, Statement *body, Loc endloc);
321 1.1 mrg Statement *syntaxCopy();
322 1.1 mrg bool checkForArgTypes();
323 1.1 mrg bool hasBreak();
324 1.1 mrg bool hasContinue();
325 1.1 mrg
326 1.1 mrg void accept(Visitor *v) { v->visit(this); }
327 1.1 mrg };
328 1.1 mrg
329 1.1 mrg class ForeachRangeStatement : public Statement
330 1.1 mrg {
331 1.1 mrg public:
332 1.1 mrg TOK op; // TOKforeach or TOKforeach_reverse
333 1.1 mrg Parameter *prm; // loop index variable
334 1.1 mrg Expression *lwr;
335 1.1 mrg Expression *upr;
336 1.1 mrg Statement *_body;
337 1.1 mrg Loc endloc; // location of closing curly bracket
338 1.1 mrg
339 1.1 mrg VarDeclaration *key;
340 1.1 mrg
341 1.1 mrg ForeachRangeStatement(Loc loc, TOK op, Parameter *prm,
342 1.1 mrg Expression *lwr, Expression *upr, Statement *body, Loc endloc);
343 1.1 mrg Statement *syntaxCopy();
344 1.1 mrg bool hasBreak();
345 1.1 mrg bool hasContinue();
346 1.1 mrg
347 1.1 mrg void accept(Visitor *v) { v->visit(this); }
348 1.1 mrg };
349 1.1 mrg
350 1.1 mrg class IfStatement : public Statement
351 1.1 mrg {
352 1.1 mrg public:
353 1.1 mrg Parameter *prm;
354 1.1 mrg Expression *condition;
355 1.1 mrg Statement *ifbody;
356 1.1 mrg Statement *elsebody;
357 1.1 mrg Loc endloc; // location of closing curly bracket
358 1.1 mrg
359 1.1 mrg VarDeclaration *match; // for MatchExpression results
360 1.1 mrg
361 1.1 mrg IfStatement(Loc loc, Parameter *prm, Expression *condition, Statement *ifbody, Statement *elsebody, Loc endloc);
362 1.1 mrg Statement *syntaxCopy();
363 1.1 mrg IfStatement *isIfStatement() { return this; }
364 1.1 mrg
365 1.1 mrg void accept(Visitor *v) { v->visit(this); }
366 1.1 mrg };
367 1.1 mrg
368 1.1 mrg class ConditionalStatement : public Statement
369 1.1 mrg {
370 1.1 mrg public:
371 1.1 mrg Condition *condition;
372 1.1 mrg Statement *ifbody;
373 1.1 mrg Statement *elsebody;
374 1.1 mrg
375 1.1 mrg ConditionalStatement(Loc loc, Condition *condition, Statement *ifbody, Statement *elsebody);
376 1.1 mrg Statement *syntaxCopy();
377 1.1 mrg Statements *flatten(Scope *sc);
378 1.1 mrg
379 1.1 mrg void accept(Visitor *v) { v->visit(this); }
380 1.1 mrg };
381 1.1 mrg
382 1.1 mrg class StaticForeachStatement : public Statement
383 1.1 mrg {
384 1.1 mrg public:
385 1.1 mrg StaticForeach *sfe;
386 1.1 mrg
387 1.1 mrg Statement *syntaxCopy();
388 1.1 mrg Statements *flatten(Scope *sc);
389 1.1 mrg
390 1.1 mrg void accept(Visitor *v) { v->visit(this); }
391 1.1 mrg };
392 1.1 mrg
393 1.1 mrg class PragmaStatement : public Statement
394 1.1 mrg {
395 1.1 mrg public:
396 1.1 mrg Identifier *ident;
397 1.1 mrg Expressions *args; // array of Expression's
398 1.1 mrg Statement *_body;
399 1.1 mrg
400 1.1 mrg PragmaStatement(Loc loc, Identifier *ident, Expressions *args, Statement *body);
401 1.1 mrg Statement *syntaxCopy();
402 1.1 mrg
403 1.1 mrg void accept(Visitor *v) { v->visit(this); }
404 1.1 mrg };
405 1.1 mrg
406 1.1 mrg class StaticAssertStatement : public Statement
407 1.1 mrg {
408 1.1 mrg public:
409 1.1 mrg StaticAssert *sa;
410 1.1 mrg
411 1.1 mrg StaticAssertStatement(StaticAssert *sa);
412 1.1 mrg Statement *syntaxCopy();
413 1.1 mrg
414 1.1 mrg void accept(Visitor *v) { v->visit(this); }
415 1.1 mrg };
416 1.1 mrg
417 1.1 mrg class SwitchStatement : public Statement
418 1.1 mrg {
419 1.1 mrg public:
420 1.1 mrg Expression *condition;
421 1.1 mrg Statement *_body;
422 1.1 mrg bool isFinal;
423 1.1 mrg
424 1.1 mrg DefaultStatement *sdefault;
425 1.1 mrg TryFinallyStatement *tf;
426 1.1 mrg GotoCaseStatements gotoCases; // array of unresolved GotoCaseStatement's
427 1.1 mrg CaseStatements *cases; // array of CaseStatement's
428 1.1 mrg int hasNoDefault; // !=0 if no default statement
429 1.1 mrg int hasVars; // !=0 if has variable case values
430 1.1 mrg VarDeclaration *lastVar;
431 1.1 mrg
432 1.1 mrg SwitchStatement(Loc loc, Expression *c, Statement *b, bool isFinal);
433 1.1 mrg Statement *syntaxCopy();
434 1.1 mrg bool hasBreak();
435 1.1 mrg bool checkLabel();
436 1.1 mrg
437 1.1 mrg void accept(Visitor *v) { v->visit(this); }
438 1.1 mrg };
439 1.1 mrg
440 1.1 mrg class CaseStatement : public Statement
441 1.1 mrg {
442 1.1 mrg public:
443 1.1 mrg Expression *exp;
444 1.1 mrg Statement *statement;
445 1.1 mrg
446 1.1 mrg int index; // which case it is (since we sort this)
447 1.1 mrg VarDeclaration *lastVar;
448 1.1 mrg
449 1.1 mrg CaseStatement(Loc loc, Expression *exp, Statement *s);
450 1.1 mrg Statement *syntaxCopy();
451 1.1 mrg int compare(RootObject *obj);
452 1.1 mrg CaseStatement *isCaseStatement() { return this; }
453 1.1 mrg
454 1.1 mrg void accept(Visitor *v) { v->visit(this); }
455 1.1 mrg };
456 1.1 mrg
457 1.1 mrg
458 1.1 mrg class CaseRangeStatement : public Statement
459 1.1 mrg {
460 1.1 mrg public:
461 1.1 mrg Expression *first;
462 1.1 mrg Expression *last;
463 1.1 mrg Statement *statement;
464 1.1 mrg
465 1.1 mrg CaseRangeStatement(Loc loc, Expression *first, Expression *last, Statement *s);
466 1.1 mrg Statement *syntaxCopy();
467 1.1 mrg void accept(Visitor *v) { v->visit(this); }
468 1.1 mrg };
469 1.1 mrg
470 1.1 mrg
471 1.1 mrg class DefaultStatement : public Statement
472 1.1 mrg {
473 1.1 mrg public:
474 1.1 mrg Statement *statement;
475 1.1 mrg VarDeclaration *lastVar;
476 1.1 mrg
477 1.1 mrg DefaultStatement(Loc loc, Statement *s);
478 1.1 mrg Statement *syntaxCopy();
479 1.1 mrg DefaultStatement *isDefaultStatement() { return this; }
480 1.1 mrg
481 1.1 mrg void accept(Visitor *v) { v->visit(this); }
482 1.1 mrg };
483 1.1 mrg
484 1.1 mrg class GotoDefaultStatement : public Statement
485 1.1 mrg {
486 1.1 mrg public:
487 1.1 mrg SwitchStatement *sw;
488 1.1 mrg
489 1.1 mrg GotoDefaultStatement(Loc loc);
490 1.1 mrg Statement *syntaxCopy();
491 1.1 mrg GotoDefaultStatement *isGotoDefaultStatement() { return this; }
492 1.1 mrg
493 1.1 mrg void accept(Visitor *v) { v->visit(this); }
494 1.1 mrg };
495 1.1 mrg
496 1.1 mrg class GotoCaseStatement : public Statement
497 1.1 mrg {
498 1.1 mrg public:
499 1.1 mrg Expression *exp; // NULL, or which case to goto
500 1.1 mrg CaseStatement *cs; // case statement it resolves to
501 1.1 mrg
502 1.1 mrg GotoCaseStatement(Loc loc, Expression *exp);
503 1.1 mrg Statement *syntaxCopy();
504 1.1 mrg GotoCaseStatement *isGotoCaseStatement() { return this; }
505 1.1 mrg
506 1.1 mrg void accept(Visitor *v) { v->visit(this); }
507 1.1 mrg };
508 1.1 mrg
509 1.1 mrg class SwitchErrorStatement : public Statement
510 1.1 mrg {
511 1.1 mrg public:
512 1.1 mrg SwitchErrorStatement(Loc loc);
513 1.1 mrg
514 1.1 mrg void accept(Visitor *v) { v->visit(this); }
515 1.1 mrg };
516 1.1 mrg
517 1.1 mrg class ReturnStatement : public Statement
518 1.1 mrg {
519 1.1 mrg public:
520 1.1 mrg Expression *exp;
521 1.1 mrg size_t caseDim;
522 1.1 mrg
523 1.1 mrg ReturnStatement(Loc loc, Expression *exp);
524 1.1 mrg Statement *syntaxCopy();
525 1.1 mrg
526 1.1 mrg ReturnStatement *isReturnStatement() { return this; }
527 1.1 mrg void accept(Visitor *v) { v->visit(this); }
528 1.1 mrg };
529 1.1 mrg
530 1.1 mrg class BreakStatement : public Statement
531 1.1 mrg {
532 1.1 mrg public:
533 1.1 mrg Identifier *ident;
534 1.1 mrg
535 1.1 mrg BreakStatement(Loc loc, Identifier *ident);
536 1.1 mrg Statement *syntaxCopy();
537 1.1 mrg
538 1.1 mrg BreakStatement *isBreakStatement() { return this; }
539 1.1 mrg void accept(Visitor *v) { v->visit(this); }
540 1.1 mrg };
541 1.1 mrg
542 1.1 mrg class ContinueStatement : public Statement
543 1.1 mrg {
544 1.1 mrg public:
545 1.1 mrg Identifier *ident;
546 1.1 mrg
547 1.1 mrg ContinueStatement(Loc loc, Identifier *ident);
548 1.1 mrg Statement *syntaxCopy();
549 1.1 mrg
550 1.1 mrg void accept(Visitor *v) { v->visit(this); }
551 1.1 mrg };
552 1.1 mrg
553 1.1 mrg class SynchronizedStatement : public Statement
554 1.1 mrg {
555 1.1 mrg public:
556 1.1 mrg Expression *exp;
557 1.1 mrg Statement *_body;
558 1.1 mrg
559 1.1 mrg SynchronizedStatement(Loc loc, Expression *exp, Statement *body);
560 1.1 mrg Statement *syntaxCopy();
561 1.1 mrg bool hasBreak();
562 1.1 mrg bool hasContinue();
563 1.1 mrg
564 1.1 mrg void accept(Visitor *v) { v->visit(this); }
565 1.1 mrg };
566 1.1 mrg
567 1.1 mrg class WithStatement : public Statement
568 1.1 mrg {
569 1.1 mrg public:
570 1.1 mrg Expression *exp;
571 1.1 mrg Statement *_body;
572 1.1 mrg VarDeclaration *wthis;
573 1.1 mrg Loc endloc;
574 1.1 mrg
575 1.1 mrg WithStatement(Loc loc, Expression *exp, Statement *body, Loc endloc);
576 1.1 mrg Statement *syntaxCopy();
577 1.1 mrg
578 1.1 mrg void accept(Visitor *v) { v->visit(this); }
579 1.1 mrg };
580 1.1 mrg
581 1.1 mrg class TryCatchStatement : public Statement
582 1.1 mrg {
583 1.1 mrg public:
584 1.1 mrg Statement *_body;
585 1.1 mrg Catches *catches;
586 1.1 mrg
587 1.1 mrg TryCatchStatement(Loc loc, Statement *body, Catches *catches);
588 1.1 mrg Statement *syntaxCopy();
589 1.1 mrg bool hasBreak();
590 1.1 mrg
591 1.1 mrg void accept(Visitor *v) { v->visit(this); }
592 1.1 mrg };
593 1.1 mrg
594 1.1 mrg class Catch : public RootObject
595 1.1 mrg {
596 1.1 mrg public:
597 1.1 mrg Loc loc;
598 1.1 mrg Type *type;
599 1.1 mrg Identifier *ident;
600 1.1 mrg VarDeclaration *var;
601 1.1 mrg Statement *handler;
602 1.1 mrg
603 1.1 mrg // set if semantic processing errors
604 1.1 mrg bool errors;
605 1.1 mrg
606 1.1 mrg // was generated by the compiler,
607 1.1 mrg // wasn't present in source code
608 1.1 mrg bool internalCatch;
609 1.1 mrg
610 1.1 mrg Catch(Loc loc, Type *t, Identifier *id, Statement *handler);
611 1.1 mrg Catch *syntaxCopy();
612 1.1 mrg };
613 1.1 mrg
614 1.1 mrg class TryFinallyStatement : public Statement
615 1.1 mrg {
616 1.1 mrg public:
617 1.1 mrg Statement *_body;
618 1.1 mrg Statement *finalbody;
619 1.1 mrg
620 1.1 mrg TryFinallyStatement(Loc loc, Statement *body, Statement *finalbody);
621 1.1 mrg static TryFinallyStatement *create(Loc loc, Statement *body, Statement *finalbody);
622 1.1 mrg Statement *syntaxCopy();
623 1.1 mrg bool hasBreak();
624 1.1 mrg bool hasContinue();
625 1.1 mrg
626 1.1 mrg void accept(Visitor *v) { v->visit(this); }
627 1.1 mrg };
628 1.1 mrg
629 1.1 mrg class OnScopeStatement : public Statement
630 1.1 mrg {
631 1.1 mrg public:
632 1.1 mrg TOK tok;
633 1.1 mrg Statement *statement;
634 1.1 mrg
635 1.1 mrg OnScopeStatement(Loc loc, TOK tok, Statement *statement);
636 1.1 mrg Statement *syntaxCopy();
637 1.1 mrg Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally);
638 1.1 mrg
639 1.1 mrg void accept(Visitor *v) { v->visit(this); }
640 1.1 mrg };
641 1.1 mrg
642 1.1 mrg class ThrowStatement : public Statement
643 1.1 mrg {
644 1.1 mrg public:
645 1.1 mrg Expression *exp;
646 1.1 mrg // was generated by the compiler,
647 1.1 mrg // wasn't present in source code
648 1.1 mrg bool internalThrow;
649 1.1 mrg
650 1.1 mrg ThrowStatement(Loc loc, Expression *exp);
651 1.1 mrg Statement *syntaxCopy();
652 1.1 mrg
653 1.1 mrg void accept(Visitor *v) { v->visit(this); }
654 1.1 mrg };
655 1.1 mrg
656 1.1 mrg class DebugStatement : public Statement
657 1.1 mrg {
658 1.1 mrg public:
659 1.1 mrg Statement *statement;
660 1.1 mrg
661 1.1 mrg DebugStatement(Loc loc, Statement *statement);
662 1.1 mrg Statement *syntaxCopy();
663 1.1 mrg Statements *flatten(Scope *sc);
664 1.1 mrg void accept(Visitor *v) { v->visit(this); }
665 1.1 mrg };
666 1.1 mrg
667 1.1 mrg class GotoStatement : public Statement
668 1.1 mrg {
669 1.1 mrg public:
670 1.1 mrg Identifier *ident;
671 1.1 mrg LabelDsymbol *label;
672 1.1 mrg TryFinallyStatement *tf;
673 1.1 mrg OnScopeStatement *os;
674 1.1 mrg VarDeclaration *lastVar;
675 1.1 mrg
676 1.1 mrg GotoStatement(Loc loc, Identifier *ident);
677 1.1 mrg Statement *syntaxCopy();
678 1.1 mrg bool checkLabel();
679 1.1 mrg
680 1.1 mrg void accept(Visitor *v) { v->visit(this); }
681 1.1 mrg };
682 1.1 mrg
683 1.1 mrg class LabelStatement : public Statement
684 1.1 mrg {
685 1.1 mrg public:
686 1.1 mrg Identifier *ident;
687 1.1 mrg Statement *statement;
688 1.1 mrg TryFinallyStatement *tf;
689 1.1 mrg OnScopeStatement *os;
690 1.1 mrg VarDeclaration *lastVar;
691 1.1 mrg Statement *gotoTarget; // interpret
692 1.1 mrg
693 1.1 mrg bool breaks; // someone did a 'break ident'
694 1.1 mrg
695 1.1 mrg LabelStatement(Loc loc, Identifier *ident, Statement *statement);
696 1.1 mrg Statement *syntaxCopy();
697 1.1 mrg Statements *flatten(Scope *sc);
698 1.1 mrg Statement *scopeCode(Scope *sc, Statement **sentry, Statement **sexit, Statement **sfinally);
699 1.1 mrg
700 1.1 mrg LabelStatement *isLabelStatement() { return this; }
701 1.1 mrg
702 1.1 mrg void accept(Visitor *v) { v->visit(this); }
703 1.1 mrg };
704 1.1 mrg
705 1.1 mrg class LabelDsymbol : public Dsymbol
706 1.1 mrg {
707 1.1 mrg public:
708 1.1 mrg LabelStatement *statement;
709 1.1 mrg
710 1.1 mrg LabelDsymbol(Identifier *ident);
711 1.1 mrg static LabelDsymbol *create(Identifier *ident);
712 1.1 mrg LabelDsymbol *isLabel();
713 1.1 mrg void accept(Visitor *v) { v->visit(this); }
714 1.1 mrg };
715 1.1 mrg
716 1.1 mrg Statement* asmSemantic(AsmStatement *s, Scope *sc);
717 1.1 mrg
718 1.1 mrg class AsmStatement : public Statement
719 1.1 mrg {
720 1.1 mrg public:
721 1.1 mrg Token *tokens;
722 1.1 mrg
723 1.1 mrg AsmStatement(Loc loc, Token *tokens);
724 1.1 mrg Statement *syntaxCopy();
725 1.1 mrg void accept(Visitor *v) { v->visit(this); }
726 1.1 mrg };
727 1.1 mrg
728 1.1 mrg class InlineAsmStatement : public AsmStatement
729 1.1 mrg {
730 1.1 mrg public:
731 1.1 mrg code *asmcode;
732 1.1 mrg unsigned asmalign; // alignment of this statement
733 1.1 mrg unsigned regs; // mask of registers modified (must match regm_t in back end)
734 1.1 mrg bool refparam; // true if function parameter is referenced
735 1.1 mrg bool naked; // true if function is to be naked
736 1.1 mrg
737 1.1 mrg InlineAsmStatement(Loc loc, Token *tokens);
738 1.1 mrg Statement *syntaxCopy();
739 1.1 mrg void accept(Visitor *v) { v->visit(this); }
740 1.1 mrg };
741 1.1 mrg
742 1.1 mrg // A GCC asm statement - assembler instructions with D expression operands
743 1.1 mrg class GccAsmStatement : public AsmStatement
744 1.1 mrg {
745 1.1 mrg public:
746 1.1 mrg StorageClass stc; // attributes of the asm {} block
747 1.1 mrg Expression *insn; // string expression that is the template for assembler code
748 1.1 mrg Expressions *args; // input and output operands of the statement
749 1.1 mrg unsigned outputargs; // of the operands in 'args', the number of output operands
750 1.1 mrg Identifiers *names; // list of symbolic names for the operands
751 1.1 mrg Expressions *constraints; // list of string constants specifying constraints on operands
752 1.1 mrg Expressions *clobbers; // list of string constants specifying clobbers and scratch registers
753 1.1 mrg Identifiers *labels; // list of goto labels
754 1.1 mrg GotoStatements *gotos; // of the goto labels, the equivalent statements they represent
755 1.1 mrg
756 1.1 mrg GccAsmStatement(Loc loc, Token *tokens);
757 1.1 mrg Statement *syntaxCopy();
758 1.1 mrg void accept(Visitor *v) { v->visit(this); }
759 1.1 mrg };
760 1.1 mrg
761 1.1 mrg // a complete asm {} block
762 1.1 mrg class CompoundAsmStatement : public CompoundStatement
763 1.1 mrg {
764 1.1 mrg public:
765 1.1 mrg StorageClass stc; // postfix attributes like nothrow/pure/@trusted
766 1.1 mrg
767 1.1 mrg CompoundAsmStatement(Loc loc, Statements *s, StorageClass stc);
768 1.1 mrg CompoundAsmStatement *syntaxCopy();
769 1.1 mrg Statements *flatten(Scope *sc);
770 1.1 mrg
771 1.1 mrg void accept(Visitor *v) { v->visit(this); }
772 1.1 mrg };
773 1.1 mrg
774 1.1 mrg class ImportStatement : public Statement
775 1.1 mrg {
776 1.1 mrg public:
777 1.1 mrg Dsymbols *imports; // Array of Import's
778 1.1 mrg
779 1.1 mrg ImportStatement(Loc loc, Dsymbols *imports);
780 1.1 mrg Statement *syntaxCopy();
781 1.1 mrg
782 1.1 mrg void accept(Visitor *v) { v->visit(this); }
783 1.1 mrg };
784