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