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