Home | History | Annotate | Line # | Download | only in dmd
      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