annotate gcc/d/dmd/statement.h @ 145:1830386684a0

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