Home | History | Annotate | Line # | Download | only in dmd
expression.h revision 1.1.1.2
      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/expression.h
      9      1.1  mrg  */
     10      1.1  mrg 
     11      1.1  mrg #pragma once
     12      1.1  mrg 
     13      1.1  mrg #include "complex_t.h"
     14      1.1  mrg #include "globals.h"
     15      1.1  mrg #include "identifier.h"
     16      1.1  mrg #include "arraytypes.h"
     17      1.1  mrg #include "intrange.h"
     18      1.1  mrg #include "visitor.h"
     19      1.1  mrg #include "tokens.h"
     20      1.1  mrg 
     21      1.1  mrg #include "root/rmem.h"
     22      1.1  mrg 
     23      1.1  mrg class Type;
     24      1.1  mrg class TypeVector;
     25      1.1  mrg struct Scope;
     26      1.1  mrg class TupleDeclaration;
     27      1.1  mrg class VarDeclaration;
     28      1.1  mrg class FuncDeclaration;
     29      1.1  mrg class FuncLiteralDeclaration;
     30      1.1  mrg class Declaration;
     31      1.1  mrg class CtorDeclaration;
     32      1.1  mrg class NewDeclaration;
     33      1.1  mrg class Dsymbol;
     34      1.1  mrg class Import;
     35      1.1  mrg class Module;
     36      1.1  mrg class ScopeDsymbol;
     37      1.1  mrg class Expression;
     38      1.1  mrg class Declaration;
     39      1.1  mrg class AggregateDeclaration;
     40      1.1  mrg class StructDeclaration;
     41      1.1  mrg class TemplateInstance;
     42      1.1  mrg class TemplateDeclaration;
     43      1.1  mrg class ClassDeclaration;
     44      1.1  mrg class BinExp;
     45      1.1  mrg class OverloadSet;
     46      1.1  mrg class Initializer;
     47      1.1  mrg class StringExp;
     48      1.1  mrg class ArrayExp;
     49      1.1  mrg class SliceExp;
     50      1.1  mrg struct UnionExp;
     51      1.1  mrg #ifdef IN_GCC
     52      1.1  mrg typedef union tree_node Symbol;
     53      1.1  mrg #else
     54      1.1  mrg struct Symbol;          // back end symbol
     55      1.1  mrg #endif
     56      1.1  mrg 
     57      1.1  mrg Expression *resolveProperties(Scope *sc, Expression *e);
     58      1.1  mrg Expression *resolvePropertiesOnly(Scope *sc, Expression *e1);
     59      1.1  mrg bool checkAccess(Loc loc, Scope *sc, Expression *e, Declaration *d);
     60      1.1  mrg bool checkAccess(Loc loc, Scope *sc, Package *p);
     61      1.1  mrg Expression *build_overload(Loc loc, Scope *sc, Expression *ethis, Expression *earg, Dsymbol *d);
     62      1.1  mrg Dsymbol *search_function(ScopeDsymbol *ad, Identifier *funcid);
     63      1.1  mrg void expandTuples(Expressions *exps);
     64      1.1  mrg TupleDeclaration *isAliasThisTuple(Expression *e);
     65      1.1  mrg int expandAliasThisTuples(Expressions *exps, size_t starti = 0);
     66      1.1  mrg FuncDeclaration *hasThis(Scope *sc);
     67      1.1  mrg Expression *fromConstInitializer(int result, Expression *e);
     68      1.1  mrg bool arrayExpressionSemantic(Expressions *exps, Scope *sc, bool preserveErrors = false);
     69      1.1  mrg TemplateDeclaration *getFuncTemplateDecl(Dsymbol *s);
     70      1.1  mrg Expression *valueNoDtor(Expression *e);
     71      1.1  mrg int modifyFieldVar(Loc loc, Scope *sc, VarDeclaration *var, Expression *e1);
     72      1.1  mrg Expression *resolveAliasThis(Scope *sc, Expression *e, bool gag = false);
     73      1.1  mrg Expression *doCopyOrMove(Scope *sc, Expression *e);
     74      1.1  mrg Expression *resolveOpDollar(Scope *sc, ArrayExp *ae, Expression **pe0);
     75      1.1  mrg Expression *resolveOpDollar(Scope *sc, ArrayExp *ae, IntervalExp *ie, Expression **pe0);
     76      1.1  mrg Expression *integralPromotions(Expression *e, Scope *sc);
     77      1.1  mrg bool discardValue(Expression *e);
     78      1.1  mrg bool isTrivialExp(Expression *e);
     79      1.1  mrg 
     80      1.1  mrg int isConst(Expression *e);
     81      1.1  mrg Expression *toDelegate(Expression *e, Type* t, Scope *sc);
     82      1.1  mrg AggregateDeclaration *isAggregate(Type *t);
     83      1.1  mrg IntRange getIntRange(Expression *e);
     84      1.1  mrg bool checkNonAssignmentArrayOp(Expression *e, bool suggestion = false);
     85      1.1  mrg bool isUnaArrayOp(TOK op);
     86      1.1  mrg bool isBinArrayOp(TOK op);
     87      1.1  mrg bool isBinAssignArrayOp(TOK op);
     88      1.1  mrg bool isArrayOpOperand(Expression *e);
     89      1.1  mrg Expression *arrayOp(BinExp *e, Scope *sc);
     90      1.1  mrg Expression *arrayOp(BinAssignExp *e, Scope *sc);
     91      1.1  mrg bool hasSideEffect(Expression *e);
     92      1.1  mrg bool canThrow(Expression *e, FuncDeclaration *func, bool mustNotThrow);
     93      1.1  mrg Expression *Expression_optimize(Expression *e, int result, bool keepLvalue);
     94      1.1  mrg MATCH implicitConvTo(Expression *e, Type *t);
     95      1.1  mrg Expression *implicitCastTo(Expression *e, Scope *sc, Type *t);
     96      1.1  mrg Expression *castTo(Expression *e, Scope *sc, Type *t);
     97      1.1  mrg Expression *ctfeInterpret(Expression *);
     98      1.1  mrg Expression *inlineCopy(Expression *e, Scope *sc);
     99      1.1  mrg Expression *op_overload(Expression *e, Scope *sc);
    100      1.1  mrg Type *toStaticArrayType(SliceExp *e);
    101      1.1  mrg Expression *scaleFactor(BinExp *be, Scope *sc);
    102      1.1  mrg Expression *typeCombine(BinExp *be, Scope *sc);
    103      1.1  mrg Expression *inferType(Expression *e, Type *t, int flag = 0);
    104      1.1  mrg Expression *semanticTraits(TraitsExp *e, Scope *sc);
    105      1.1  mrg Type *getIndirection(Type *t);
    106      1.1  mrg 
    107      1.1  mrg Expression *checkGC(Scope *sc, Expression *e);
    108      1.1  mrg 
    109      1.1  mrg /* Run CTFE on the expression, but allow the expression to be a TypeExp
    110      1.1  mrg  * or a tuple containing a TypeExp. (This is required by pragma(msg)).
    111      1.1  mrg  */
    112      1.1  mrg Expression *ctfeInterpretForPragmaMsg(Expression *e);
    113      1.1  mrg 
    114      1.1  mrg enum OwnedBy
    115      1.1  mrg {
    116      1.1  mrg     OWNEDcode,      // normal code expression in AST
    117      1.1  mrg     OWNEDctfe,      // value expression for CTFE
    118      1.1  mrg     OWNEDcache      // constant value cached for CTFE
    119      1.1  mrg };
    120      1.1  mrg 
    121      1.1  mrg #define WANTvalue   0   // default
    122      1.1  mrg #define WANTexpand  1   // expand const/immutable variables if possible
    123      1.1  mrg 
    124      1.1  mrg class Expression : public RootObject
    125      1.1  mrg {
    126      1.1  mrg public:
    127      1.1  mrg     Loc loc;                    // file location
    128      1.1  mrg     Type *type;                 // !=NULL means that semantic() has been run
    129      1.1  mrg     TOK op;                     // to minimize use of dynamic_cast
    130      1.1  mrg     unsigned char size;         // # of bytes in Expression so we can copy() it
    131      1.1  mrg     unsigned char parens;       // if this is a parenthesized expression
    132      1.1  mrg 
    133      1.1  mrg     Expression(Loc loc, TOK op, int size);
    134      1.1  mrg     static void _init();
    135      1.1  mrg     Expression *copy();
    136      1.1  mrg     virtual Expression *syntaxCopy();
    137      1.1  mrg 
    138      1.1  mrg     // kludge for template.isExpression()
    139      1.1  mrg     int dyncast() const { return DYNCAST_EXPRESSION; }
    140      1.1  mrg 
    141      1.1  mrg     void print();
    142      1.1  mrg     const char *toChars();
    143      1.1  mrg     void error(const char *format, ...) const;
    144      1.1  mrg     void warning(const char *format, ...) const;
    145      1.1  mrg     void deprecation(const char *format, ...) const;
    146      1.1  mrg 
    147      1.1  mrg     // creates a single expression which is effectively (e1, e2)
    148      1.1  mrg     // this new expression does not necessarily need to have valid D source code representation,
    149      1.1  mrg     // for example, it may include declaration expressions
    150      1.1  mrg     static Expression *combine(Expression *e1, Expression *e2);
    151      1.1  mrg     static Expression *extractLast(Expression *e, Expression **pe0);
    152      1.1  mrg     static Expressions *arraySyntaxCopy(Expressions *exps);
    153      1.1  mrg 
    154      1.1  mrg     virtual dinteger_t toInteger();
    155      1.1  mrg     virtual uinteger_t toUInteger();
    156      1.1  mrg     virtual real_t toReal();
    157      1.1  mrg     virtual real_t toImaginary();
    158      1.1  mrg     virtual complex_t toComplex();
    159      1.1  mrg     virtual StringExp *toStringExp();
    160  1.1.1.2  mrg     virtual TupleExp *toTupleExp();
    161      1.1  mrg     virtual bool isLvalue();
    162      1.1  mrg     virtual Expression *toLvalue(Scope *sc, Expression *e);
    163      1.1  mrg     virtual Expression *modifiableLvalue(Scope *sc, Expression *e);
    164      1.1  mrg     Expression *implicitCastTo(Scope *sc, Type *t)
    165      1.1  mrg     {
    166      1.1  mrg         return ::implicitCastTo(this, sc, t);
    167      1.1  mrg     }
    168      1.1  mrg     MATCH implicitConvTo(Type *t)
    169      1.1  mrg     {
    170      1.1  mrg         return ::implicitConvTo(this, t);
    171      1.1  mrg     }
    172      1.1  mrg     Expression *castTo(Scope *sc, Type *t)
    173      1.1  mrg     {
    174      1.1  mrg         return ::castTo(this, sc, t);
    175      1.1  mrg     }
    176      1.1  mrg     virtual Expression *resolveLoc(Loc loc, Scope *sc);
    177      1.1  mrg     virtual bool checkType();
    178      1.1  mrg     virtual bool checkValue();
    179      1.1  mrg     bool checkScalar();
    180      1.1  mrg     bool checkNoBool();
    181      1.1  mrg     bool checkIntegral();
    182      1.1  mrg     bool checkArithmetic();
    183      1.1  mrg     void checkDeprecated(Scope *sc, Dsymbol *s);
    184      1.1  mrg     bool checkPurity(Scope *sc, FuncDeclaration *f);
    185      1.1  mrg     bool checkPurity(Scope *sc, VarDeclaration *v);
    186      1.1  mrg     bool checkSafety(Scope *sc, FuncDeclaration *f);
    187      1.1  mrg     bool checkNogc(Scope *sc, FuncDeclaration *f);
    188      1.1  mrg     bool checkPostblit(Scope *sc, Type *t);
    189      1.1  mrg     bool checkRightThis(Scope *sc);
    190      1.1  mrg     bool checkReadModifyWrite(TOK rmwOp, Expression *ex = NULL);
    191      1.1  mrg     virtual int checkModifiable(Scope *sc, int flag = 0);
    192      1.1  mrg     virtual Expression *toBoolean(Scope *sc);
    193      1.1  mrg     virtual Expression *addDtorHook(Scope *sc);
    194      1.1  mrg     Expression *addressOf();
    195      1.1  mrg     Expression *deref();
    196      1.1  mrg 
    197      1.1  mrg     Expression *optimize(int result, bool keepLvalue = false)
    198      1.1  mrg     {
    199      1.1  mrg         return Expression_optimize(this, result, keepLvalue);
    200      1.1  mrg     }
    201      1.1  mrg 
    202      1.1  mrg     // Entry point for CTFE.
    203      1.1  mrg     // A compile-time result is required. Give an error if not possible
    204      1.1  mrg     Expression *ctfeInterpret()
    205      1.1  mrg     {
    206      1.1  mrg         return ::ctfeInterpret(this);
    207      1.1  mrg     }
    208      1.1  mrg 
    209      1.1  mrg     int isConst() { return ::isConst(this); }
    210      1.1  mrg     virtual bool isBool(bool result);
    211      1.1  mrg     Expression *op_overload(Scope *sc)
    212      1.1  mrg     {
    213      1.1  mrg         return ::op_overload(this, sc);
    214      1.1  mrg     }
    215      1.1  mrg 
    216      1.1  mrg     virtual bool hasCode()
    217      1.1  mrg     {
    218      1.1  mrg         return true;
    219      1.1  mrg     }
    220      1.1  mrg 
    221      1.1  mrg     virtual void accept(Visitor *v) { v->visit(this); }
    222      1.1  mrg };
    223      1.1  mrg 
    224      1.1  mrg class IntegerExp : public Expression
    225      1.1  mrg {
    226      1.1  mrg public:
    227      1.1  mrg     dinteger_t value;
    228      1.1  mrg 
    229      1.1  mrg     IntegerExp(Loc loc, dinteger_t value, Type *type);
    230      1.1  mrg     IntegerExp(dinteger_t value);
    231      1.1  mrg     static IntegerExp *create(Loc loc, dinteger_t value, Type *type);
    232      1.1  mrg     bool equals(RootObject *o);
    233      1.1  mrg     dinteger_t toInteger();
    234      1.1  mrg     real_t toReal();
    235      1.1  mrg     real_t toImaginary();
    236      1.1  mrg     complex_t toComplex();
    237      1.1  mrg     bool isBool(bool result);
    238      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    239      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    240      1.1  mrg     dinteger_t getInteger() { return value; }
    241      1.1  mrg     void setInteger(dinteger_t value);
    242      1.1  mrg     void normalize();
    243      1.1  mrg };
    244      1.1  mrg 
    245      1.1  mrg class ErrorExp : public Expression
    246      1.1  mrg {
    247      1.1  mrg public:
    248      1.1  mrg     ErrorExp();
    249      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    250      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    251      1.1  mrg 
    252      1.1  mrg     static ErrorExp *errorexp; // handy shared value
    253      1.1  mrg };
    254      1.1  mrg 
    255      1.1  mrg class RealExp : public Expression
    256      1.1  mrg {
    257      1.1  mrg public:
    258      1.1  mrg     real_t value;
    259      1.1  mrg 
    260      1.1  mrg     RealExp(Loc loc, real_t value, Type *type);
    261      1.1  mrg     static RealExp *create(Loc loc, real_t value, Type *type);
    262      1.1  mrg     bool equals(RootObject *o);
    263      1.1  mrg     dinteger_t toInteger();
    264      1.1  mrg     uinteger_t toUInteger();
    265      1.1  mrg     real_t toReal();
    266      1.1  mrg     real_t toImaginary();
    267      1.1  mrg     complex_t toComplex();
    268      1.1  mrg     bool isBool(bool result);
    269      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    270      1.1  mrg };
    271      1.1  mrg 
    272      1.1  mrg class ComplexExp : public Expression
    273      1.1  mrg {
    274      1.1  mrg public:
    275      1.1  mrg     complex_t value;
    276      1.1  mrg 
    277      1.1  mrg     ComplexExp(Loc loc, complex_t value, Type *type);
    278      1.1  mrg     static ComplexExp *create(Loc loc, complex_t value, Type *type);
    279      1.1  mrg     bool equals(RootObject *o);
    280      1.1  mrg     dinteger_t toInteger();
    281      1.1  mrg     uinteger_t toUInteger();
    282      1.1  mrg     real_t toReal();
    283      1.1  mrg     real_t toImaginary();
    284      1.1  mrg     complex_t toComplex();
    285      1.1  mrg     bool isBool(bool result);
    286      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    287      1.1  mrg };
    288      1.1  mrg 
    289      1.1  mrg class IdentifierExp : public Expression
    290      1.1  mrg {
    291      1.1  mrg public:
    292      1.1  mrg     Identifier *ident;
    293      1.1  mrg 
    294      1.1  mrg     IdentifierExp(Loc loc, Identifier *ident);
    295      1.1  mrg     static IdentifierExp *create(Loc loc, Identifier *ident);
    296      1.1  mrg     bool isLvalue();
    297      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    298      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    299      1.1  mrg };
    300      1.1  mrg 
    301      1.1  mrg class DollarExp : public IdentifierExp
    302      1.1  mrg {
    303      1.1  mrg public:
    304      1.1  mrg     DollarExp(Loc loc);
    305      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    306      1.1  mrg };
    307      1.1  mrg 
    308      1.1  mrg class DsymbolExp : public Expression
    309      1.1  mrg {
    310      1.1  mrg public:
    311      1.1  mrg     Dsymbol *s;
    312      1.1  mrg     bool hasOverloads;
    313      1.1  mrg 
    314      1.1  mrg     DsymbolExp(Loc loc, Dsymbol *s, bool hasOverloads = true);
    315      1.1  mrg     bool isLvalue();
    316      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    317      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    318      1.1  mrg };
    319      1.1  mrg 
    320      1.1  mrg class ThisExp : public Expression
    321      1.1  mrg {
    322      1.1  mrg public:
    323      1.1  mrg     VarDeclaration *var;
    324      1.1  mrg 
    325      1.1  mrg     ThisExp(Loc loc);
    326      1.1  mrg     bool isBool(bool result);
    327      1.1  mrg     bool isLvalue();
    328      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    329      1.1  mrg 
    330      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    331      1.1  mrg };
    332      1.1  mrg 
    333      1.1  mrg class SuperExp : public ThisExp
    334      1.1  mrg {
    335      1.1  mrg public:
    336      1.1  mrg     SuperExp(Loc loc);
    337      1.1  mrg 
    338      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    339      1.1  mrg };
    340      1.1  mrg 
    341      1.1  mrg class NullExp : public Expression
    342      1.1  mrg {
    343      1.1  mrg public:
    344      1.1  mrg     unsigned char committed;    // !=0 if type is committed
    345      1.1  mrg 
    346      1.1  mrg     NullExp(Loc loc, Type *t = NULL);
    347      1.1  mrg     bool equals(RootObject *o);
    348      1.1  mrg     bool isBool(bool result);
    349      1.1  mrg     StringExp *toStringExp();
    350      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    351      1.1  mrg };
    352      1.1  mrg 
    353      1.1  mrg class StringExp : public Expression
    354      1.1  mrg {
    355      1.1  mrg public:
    356      1.1  mrg     void *string;       // char, wchar, or dchar data
    357      1.1  mrg     size_t len;         // number of chars, wchars, or dchars
    358      1.1  mrg     unsigned char sz;   // 1: char, 2: wchar, 4: dchar
    359      1.1  mrg     unsigned char committed;    // !=0 if type is committed
    360      1.1  mrg     utf8_t postfix;      // 'c', 'w', 'd'
    361      1.1  mrg     OwnedBy ownedByCtfe;
    362      1.1  mrg 
    363      1.1  mrg     StringExp(Loc loc, char *s);
    364      1.1  mrg     StringExp(Loc loc, void *s, size_t len);
    365      1.1  mrg     StringExp(Loc loc, void *s, size_t len, utf8_t postfix);
    366      1.1  mrg     static StringExp *create(Loc loc, char *s);
    367      1.1  mrg     static StringExp *create(Loc loc, void *s, size_t len);
    368      1.1  mrg     bool equals(RootObject *o);
    369      1.1  mrg     StringExp *toStringExp();
    370      1.1  mrg     StringExp *toUTF8(Scope *sc);
    371      1.1  mrg     int compare(RootObject *obj);
    372      1.1  mrg     bool isBool(bool result);
    373      1.1  mrg     bool isLvalue();
    374      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    375      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
    376      1.1  mrg     unsigned charAt(uinteger_t i) const;
    377      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    378      1.1  mrg     size_t numberOfCodeUnits(int tynto = 0) const;
    379      1.1  mrg     void writeTo(void* dest, bool zero, int tyto = 0) const;
    380      1.1  mrg     char *toPtr();
    381      1.1  mrg };
    382      1.1  mrg 
    383      1.1  mrg // Tuple
    384      1.1  mrg 
    385      1.1  mrg class TupleExp : public Expression
    386      1.1  mrg {
    387      1.1  mrg public:
    388      1.1  mrg     Expression *e0;     // side-effect part
    389      1.1  mrg     /* Tuple-field access may need to take out its side effect part.
    390      1.1  mrg      * For example:
    391      1.1  mrg      *      foo().tupleof
    392      1.1  mrg      * is rewritten as:
    393      1.1  mrg      *      (ref __tup = foo(); tuple(__tup.field0, __tup.field1, ...))
    394      1.1  mrg      * The declaration of temporary variable __tup will be stored in TupleExp::e0.
    395      1.1  mrg      */
    396      1.1  mrg     Expressions *exps;
    397      1.1  mrg 
    398      1.1  mrg     TupleExp(Loc loc, Expression *e0, Expressions *exps);
    399      1.1  mrg     TupleExp(Loc loc, Expressions *exps);
    400      1.1  mrg     TupleExp(Loc loc, TupleDeclaration *tup);
    401  1.1.1.2  mrg     TupleExp *toTupleExp();
    402      1.1  mrg     Expression *syntaxCopy();
    403      1.1  mrg     bool equals(RootObject *o);
    404      1.1  mrg 
    405      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    406      1.1  mrg };
    407      1.1  mrg 
    408      1.1  mrg class ArrayLiteralExp : public Expression
    409      1.1  mrg {
    410      1.1  mrg public:
    411      1.1  mrg     Expression *basis;
    412      1.1  mrg     Expressions *elements;
    413      1.1  mrg     OwnedBy ownedByCtfe;
    414      1.1  mrg 
    415      1.1  mrg     ArrayLiteralExp(Loc loc, Type *type, Expressions *elements);
    416      1.1  mrg     ArrayLiteralExp(Loc loc, Type *type, Expression *e);
    417      1.1  mrg     ArrayLiteralExp(Loc loc, Type *type, Expression *basis, Expressions *elements);
    418      1.1  mrg     static ArrayLiteralExp *create(Loc loc, Expressions *elements);
    419      1.1  mrg     Expression *syntaxCopy();
    420      1.1  mrg     bool equals(RootObject *o);
    421      1.1  mrg     Expression *getElement(d_size_t i);
    422      1.1  mrg     static Expressions* copyElements(Expression *e1, Expression *e2 = NULL);
    423      1.1  mrg     bool isBool(bool result);
    424      1.1  mrg     StringExp *toStringExp();
    425      1.1  mrg 
    426      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    427      1.1  mrg };
    428      1.1  mrg 
    429      1.1  mrg class AssocArrayLiteralExp : public Expression
    430      1.1  mrg {
    431      1.1  mrg public:
    432      1.1  mrg     Expressions *keys;
    433      1.1  mrg     Expressions *values;
    434      1.1  mrg     OwnedBy ownedByCtfe;
    435      1.1  mrg 
    436      1.1  mrg     AssocArrayLiteralExp(Loc loc, Expressions *keys, Expressions *values);
    437      1.1  mrg     bool equals(RootObject *o);
    438      1.1  mrg     Expression *syntaxCopy();
    439      1.1  mrg     bool isBool(bool result);
    440      1.1  mrg 
    441      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    442      1.1  mrg };
    443      1.1  mrg 
    444      1.1  mrg // scrubReturnValue is running
    445      1.1  mrg #define stageScrub          0x1
    446      1.1  mrg // hasNonConstPointers is running
    447      1.1  mrg #define stageSearchPointers 0x2
    448      1.1  mrg // optimize is running
    449      1.1  mrg #define stageOptimize       0x4
    450      1.1  mrg // apply is running
    451      1.1  mrg #define stageApply          0x8
    452      1.1  mrg //inlineScan is running
    453      1.1  mrg #define stageInlineScan     0x10
    454      1.1  mrg // toCBuffer is running
    455      1.1  mrg #define stageToCBuffer      0x20
    456      1.1  mrg 
    457      1.1  mrg class StructLiteralExp : public Expression
    458      1.1  mrg {
    459      1.1  mrg public:
    460      1.1  mrg     StructDeclaration *sd;      // which aggregate this is for
    461      1.1  mrg     Expressions *elements;      // parallels sd->fields[] with NULL entries for fields to skip
    462      1.1  mrg     Type *stype;                // final type of result (can be different from sd's type)
    463      1.1  mrg 
    464      1.1  mrg     bool useStaticInit;         // if this is true, use the StructDeclaration's init symbol
    465      1.1  mrg     Symbol *sym;                // back end symbol to initialize with literal
    466      1.1  mrg 
    467      1.1  mrg     OwnedBy ownedByCtfe;
    468      1.1  mrg 
    469      1.1  mrg     // pointer to the origin instance of the expression.
    470      1.1  mrg     // once a new expression is created, origin is set to 'this'.
    471      1.1  mrg     // anytime when an expression copy is created, 'origin' pointer is set to
    472      1.1  mrg     // 'origin' pointer value of the original expression.
    473      1.1  mrg     StructLiteralExp *origin;
    474      1.1  mrg 
    475      1.1  mrg     // those fields need to prevent a infinite recursion when one field of struct initialized with 'this' pointer.
    476      1.1  mrg     StructLiteralExp *inlinecopy;
    477      1.1  mrg 
    478      1.1  mrg     // anytime when recursive function is calling, 'stageflags' marks with bit flag of
    479      1.1  mrg     // current stage and unmarks before return from this function.
    480      1.1  mrg     // 'inlinecopy' uses similar 'stageflags' and from multiple evaluation 'doInline'
    481      1.1  mrg     // (with infinite recursion) of this expression.
    482      1.1  mrg     int stageflags;
    483      1.1  mrg 
    484      1.1  mrg     StructLiteralExp(Loc loc, StructDeclaration *sd, Expressions *elements, Type *stype = NULL);
    485      1.1  mrg     static StructLiteralExp *create(Loc loc, StructDeclaration *sd, void *elements, Type *stype = NULL);
    486      1.1  mrg     bool equals(RootObject *o);
    487      1.1  mrg     Expression *syntaxCopy();
    488      1.1  mrg     Expression *getField(Type *type, unsigned offset);
    489      1.1  mrg     int getFieldIndex(Type *type, unsigned offset);
    490      1.1  mrg     Expression *addDtorHook(Scope *sc);
    491      1.1  mrg 
    492      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    493      1.1  mrg };
    494      1.1  mrg 
    495      1.1  mrg class DotIdExp;
    496      1.1  mrg DotIdExp *typeDotIdExp(Loc loc, Type *type, Identifier *ident);
    497      1.1  mrg 
    498      1.1  mrg class TypeExp : public Expression
    499      1.1  mrg {
    500      1.1  mrg public:
    501      1.1  mrg     TypeExp(Loc loc, Type *type);
    502      1.1  mrg     Expression *syntaxCopy();
    503      1.1  mrg     bool checkType();
    504      1.1  mrg     bool checkValue();
    505      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    506      1.1  mrg };
    507      1.1  mrg 
    508      1.1  mrg class ScopeExp : public Expression
    509      1.1  mrg {
    510      1.1  mrg public:
    511      1.1  mrg     ScopeDsymbol *sds;
    512      1.1  mrg 
    513      1.1  mrg     ScopeExp(Loc loc, ScopeDsymbol *sds);
    514      1.1  mrg     Expression *syntaxCopy();
    515      1.1  mrg     bool checkType();
    516      1.1  mrg     bool checkValue();
    517      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    518      1.1  mrg };
    519      1.1  mrg 
    520      1.1  mrg class TemplateExp : public Expression
    521      1.1  mrg {
    522      1.1  mrg public:
    523      1.1  mrg     TemplateDeclaration *td;
    524      1.1  mrg     FuncDeclaration *fd;
    525      1.1  mrg 
    526      1.1  mrg     TemplateExp(Loc loc, TemplateDeclaration *td, FuncDeclaration *fd = NULL);
    527      1.1  mrg     bool isLvalue();
    528      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    529      1.1  mrg     bool checkType();
    530      1.1  mrg     bool checkValue();
    531      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    532      1.1  mrg };
    533      1.1  mrg 
    534      1.1  mrg class NewExp : public Expression
    535      1.1  mrg {
    536      1.1  mrg public:
    537      1.1  mrg     /* thisexp.new(newargs) newtype(arguments)
    538      1.1  mrg      */
    539      1.1  mrg     Expression *thisexp;        // if !NULL, 'this' for class being allocated
    540      1.1  mrg     Expressions *newargs;       // Array of Expression's to call new operator
    541      1.1  mrg     Type *newtype;
    542      1.1  mrg     Expressions *arguments;     // Array of Expression's
    543      1.1  mrg 
    544      1.1  mrg     Expression *argprefix;      // expression to be evaluated just before arguments[]
    545      1.1  mrg 
    546      1.1  mrg     CtorDeclaration *member;    // constructor function
    547      1.1  mrg     NewDeclaration *allocator;  // allocator function
    548      1.1  mrg     int onstack;                // allocate on stack
    549      1.1  mrg 
    550      1.1  mrg     NewExp(Loc loc, Expression *thisexp, Expressions *newargs,
    551      1.1  mrg         Type *newtype, Expressions *arguments);
    552      1.1  mrg     static NewExp *create(Loc loc, Expression *thisexp, Expressions *newargs, Type *newtype, Expressions *arguments);
    553      1.1  mrg     Expression *syntaxCopy();
    554      1.1  mrg 
    555      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    556      1.1  mrg };
    557      1.1  mrg 
    558      1.1  mrg class NewAnonClassExp : public Expression
    559      1.1  mrg {
    560      1.1  mrg public:
    561      1.1  mrg     /* thisexp.new(newargs) class baseclasses { } (arguments)
    562      1.1  mrg      */
    563      1.1  mrg     Expression *thisexp;        // if !NULL, 'this' for class being allocated
    564      1.1  mrg     Expressions *newargs;       // Array of Expression's to call new operator
    565      1.1  mrg     ClassDeclaration *cd;       // class being instantiated
    566      1.1  mrg     Expressions *arguments;     // Array of Expression's to call class constructor
    567      1.1  mrg 
    568      1.1  mrg     NewAnonClassExp(Loc loc, Expression *thisexp, Expressions *newargs,
    569      1.1  mrg         ClassDeclaration *cd, Expressions *arguments);
    570      1.1  mrg     Expression *syntaxCopy();
    571      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    572      1.1  mrg };
    573      1.1  mrg 
    574      1.1  mrg class SymbolExp : public Expression
    575      1.1  mrg {
    576      1.1  mrg public:
    577      1.1  mrg     Declaration *var;
    578      1.1  mrg     bool hasOverloads;
    579      1.1  mrg     SymbolExp(Loc loc, TOK op, int size, Declaration *var, bool hasOverloads);
    580      1.1  mrg 
    581      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    582      1.1  mrg };
    583      1.1  mrg 
    584      1.1  mrg // Offset from symbol
    585      1.1  mrg 
    586      1.1  mrg class SymOffExp : public SymbolExp
    587      1.1  mrg {
    588      1.1  mrg public:
    589      1.1  mrg     dinteger_t offset;
    590      1.1  mrg 
    591      1.1  mrg     SymOffExp(Loc loc, Declaration *var, dinteger_t offset, bool hasOverloads = true);
    592      1.1  mrg     bool isBool(bool result);
    593      1.1  mrg 
    594      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    595      1.1  mrg };
    596      1.1  mrg 
    597      1.1  mrg // Variable
    598      1.1  mrg 
    599      1.1  mrg class VarExp : public SymbolExp
    600      1.1  mrg {
    601      1.1  mrg public:
    602      1.1  mrg     VarExp(Loc loc, Declaration *var, bool hasOverloads = true);
    603      1.1  mrg     static VarExp *create(Loc loc, Declaration *var, bool hasOverloads = true);
    604      1.1  mrg     bool equals(RootObject *o);
    605      1.1  mrg     int checkModifiable(Scope *sc, int flag);
    606      1.1  mrg     bool checkReadModifyWrite();
    607      1.1  mrg     bool isLvalue();
    608      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    609      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
    610      1.1  mrg 
    611      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    612      1.1  mrg };
    613      1.1  mrg 
    614      1.1  mrg // Overload Set
    615      1.1  mrg 
    616      1.1  mrg class OverExp : public Expression
    617      1.1  mrg {
    618      1.1  mrg public:
    619      1.1  mrg     OverloadSet *vars;
    620      1.1  mrg 
    621      1.1  mrg     OverExp(Loc loc, OverloadSet *s);
    622      1.1  mrg     bool isLvalue();
    623      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    624      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    625      1.1  mrg };
    626      1.1  mrg 
    627      1.1  mrg // Function/Delegate literal
    628      1.1  mrg 
    629      1.1  mrg class FuncExp : public Expression
    630      1.1  mrg {
    631      1.1  mrg public:
    632      1.1  mrg     FuncLiteralDeclaration *fd;
    633      1.1  mrg     TemplateDeclaration *td;
    634      1.1  mrg     TOK tok;
    635      1.1  mrg 
    636      1.1  mrg     FuncExp(Loc loc, Dsymbol *s);
    637      1.1  mrg     bool equals(RootObject *o);
    638      1.1  mrg     void genIdent(Scope *sc);
    639      1.1  mrg     Expression *syntaxCopy();
    640      1.1  mrg     MATCH matchType(Type *to, Scope *sc, FuncExp **pfe, int flag = 0);
    641      1.1  mrg     const char *toChars();
    642      1.1  mrg     bool checkType();
    643      1.1  mrg     bool checkValue();
    644      1.1  mrg 
    645      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    646      1.1  mrg };
    647      1.1  mrg 
    648      1.1  mrg // Declaration of a symbol
    649      1.1  mrg 
    650      1.1  mrg // D grammar allows declarations only as statements. However in AST representation
    651      1.1  mrg // it can be part of any expression. This is used, for example, during internal
    652      1.1  mrg // syntax re-writes to inject hidden symbols.
    653      1.1  mrg class DeclarationExp : public Expression
    654      1.1  mrg {
    655      1.1  mrg public:
    656      1.1  mrg     Dsymbol *declaration;
    657      1.1  mrg 
    658      1.1  mrg     DeclarationExp(Loc loc, Dsymbol *declaration);
    659      1.1  mrg     Expression *syntaxCopy();
    660      1.1  mrg 
    661      1.1  mrg     bool hasCode();
    662      1.1  mrg 
    663      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    664      1.1  mrg };
    665      1.1  mrg 
    666      1.1  mrg class TypeidExp : public Expression
    667      1.1  mrg {
    668      1.1  mrg public:
    669      1.1  mrg     RootObject *obj;
    670      1.1  mrg 
    671      1.1  mrg     TypeidExp(Loc loc, RootObject *obj);
    672      1.1  mrg     Expression *syntaxCopy();
    673      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    674      1.1  mrg };
    675      1.1  mrg 
    676      1.1  mrg class TraitsExp : public Expression
    677      1.1  mrg {
    678      1.1  mrg public:
    679      1.1  mrg     Identifier *ident;
    680      1.1  mrg     Objects *args;
    681      1.1  mrg 
    682      1.1  mrg     TraitsExp(Loc loc, Identifier *ident, Objects *args);
    683      1.1  mrg     Expression *syntaxCopy();
    684      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    685      1.1  mrg };
    686      1.1  mrg 
    687      1.1  mrg class HaltExp : public Expression
    688      1.1  mrg {
    689      1.1  mrg public:
    690      1.1  mrg     HaltExp(Loc loc);
    691      1.1  mrg 
    692      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    693      1.1  mrg };
    694      1.1  mrg 
    695      1.1  mrg class IsExp : public Expression
    696      1.1  mrg {
    697      1.1  mrg public:
    698      1.1  mrg     /* is(targ id tok tspec)
    699      1.1  mrg      * is(targ id == tok2)
    700      1.1  mrg      */
    701      1.1  mrg     Type *targ;
    702      1.1  mrg     Identifier *id;     // can be NULL
    703      1.1  mrg     TOK tok;       // ':' or '=='
    704      1.1  mrg     Type *tspec;        // can be NULL
    705      1.1  mrg     TOK tok2;      // 'struct', 'union', etc.
    706      1.1  mrg     TemplateParameters *parameters;
    707      1.1  mrg 
    708      1.1  mrg     IsExp(Loc loc, Type *targ, Identifier *id, TOK tok, Type *tspec,
    709      1.1  mrg         TOK tok2, TemplateParameters *parameters);
    710      1.1  mrg     Expression *syntaxCopy();
    711      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    712      1.1  mrg };
    713      1.1  mrg 
    714      1.1  mrg /****************************************************************/
    715      1.1  mrg 
    716      1.1  mrg class UnaExp : public Expression
    717      1.1  mrg {
    718      1.1  mrg public:
    719      1.1  mrg     Expression *e1;
    720      1.1  mrg     Type *att1; // Save alias this type to detect recursion
    721      1.1  mrg 
    722      1.1  mrg     UnaExp(Loc loc, TOK op, int size, Expression *e1);
    723      1.1  mrg     Expression *syntaxCopy();
    724      1.1  mrg     Expression *incompatibleTypes();
    725      1.1  mrg     Expression *resolveLoc(Loc loc, Scope *sc);
    726      1.1  mrg 
    727      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    728      1.1  mrg };
    729      1.1  mrg 
    730      1.1  mrg typedef UnionExp (*fp_t)(Loc loc, Type *, Expression *, Expression *);
    731      1.1  mrg typedef int (*fp2_t)(Loc loc, TOK, Expression *, Expression *);
    732      1.1  mrg 
    733      1.1  mrg class BinExp : public Expression
    734      1.1  mrg {
    735      1.1  mrg public:
    736      1.1  mrg     Expression *e1;
    737      1.1  mrg     Expression *e2;
    738      1.1  mrg 
    739      1.1  mrg     Type *att1; // Save alias this type to detect recursion
    740      1.1  mrg     Type *att2; // Save alias this type to detect recursion
    741      1.1  mrg 
    742      1.1  mrg     BinExp(Loc loc, TOK op, int size, Expression *e1, Expression *e2);
    743      1.1  mrg     Expression *syntaxCopy();
    744      1.1  mrg     Expression *incompatibleTypes();
    745      1.1  mrg     Expression *checkOpAssignTypes(Scope *sc);
    746      1.1  mrg     bool checkIntegralBin();
    747      1.1  mrg     bool checkArithmeticBin();
    748      1.1  mrg 
    749      1.1  mrg     Expression *reorderSettingAAElem(Scope *sc);
    750      1.1  mrg 
    751      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    752      1.1  mrg };
    753      1.1  mrg 
    754      1.1  mrg class BinAssignExp : public BinExp
    755      1.1  mrg {
    756      1.1  mrg public:
    757      1.1  mrg     BinAssignExp(Loc loc, TOK op, int size, Expression *e1, Expression *e2);
    758      1.1  mrg 
    759      1.1  mrg     bool isLvalue();
    760      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *ex);
    761      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
    762      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    763      1.1  mrg };
    764      1.1  mrg 
    765      1.1  mrg /****************************************************************/
    766      1.1  mrg 
    767      1.1  mrg class CompileExp : public UnaExp
    768      1.1  mrg {
    769      1.1  mrg public:
    770      1.1  mrg     CompileExp(Loc loc, Expression *e);
    771      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    772      1.1  mrg };
    773      1.1  mrg 
    774      1.1  mrg class ImportExp : public UnaExp
    775      1.1  mrg {
    776      1.1  mrg public:
    777      1.1  mrg     ImportExp(Loc loc, Expression *e);
    778      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    779      1.1  mrg };
    780      1.1  mrg 
    781      1.1  mrg class AssertExp : public UnaExp
    782      1.1  mrg {
    783      1.1  mrg public:
    784      1.1  mrg     Expression *msg;
    785      1.1  mrg 
    786      1.1  mrg     AssertExp(Loc loc, Expression *e, Expression *msg = NULL);
    787      1.1  mrg     Expression *syntaxCopy();
    788      1.1  mrg 
    789      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    790      1.1  mrg };
    791      1.1  mrg 
    792      1.1  mrg class DotIdExp : public UnaExp
    793      1.1  mrg {
    794      1.1  mrg public:
    795      1.1  mrg     Identifier *ident;
    796      1.1  mrg     bool noderef;       // true if the result of the expression will never be dereferenced
    797      1.1  mrg     bool wantsym;       // do not replace Symbol with its initializer during semantic()
    798      1.1  mrg 
    799      1.1  mrg     DotIdExp(Loc loc, Expression *e, Identifier *ident);
    800      1.1  mrg     static DotIdExp *create(Loc loc, Expression *e, Identifier *ident);
    801      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    802      1.1  mrg };
    803      1.1  mrg 
    804      1.1  mrg class DotTemplateExp : public UnaExp
    805      1.1  mrg {
    806      1.1  mrg public:
    807      1.1  mrg     TemplateDeclaration *td;
    808      1.1  mrg 
    809      1.1  mrg     DotTemplateExp(Loc loc, Expression *e, TemplateDeclaration *td);
    810  1.1.1.2  mrg     bool checkType();
    811  1.1.1.2  mrg     bool checkValue();
    812      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    813      1.1  mrg };
    814      1.1  mrg 
    815      1.1  mrg class DotVarExp : public UnaExp
    816      1.1  mrg {
    817      1.1  mrg public:
    818      1.1  mrg     Declaration *var;
    819      1.1  mrg     bool hasOverloads;
    820      1.1  mrg 
    821      1.1  mrg     DotVarExp(Loc loc, Expression *e, Declaration *var, bool hasOverloads = true);
    822      1.1  mrg     int checkModifiable(Scope *sc, int flag);
    823      1.1  mrg     bool checkReadModifyWrite();
    824      1.1  mrg     bool isLvalue();
    825      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    826      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
    827      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    828      1.1  mrg };
    829      1.1  mrg 
    830      1.1  mrg class DotTemplateInstanceExp : public UnaExp
    831      1.1  mrg {
    832      1.1  mrg public:
    833      1.1  mrg     TemplateInstance *ti;
    834      1.1  mrg 
    835      1.1  mrg     DotTemplateInstanceExp(Loc loc, Expression *e, Identifier *name, Objects *tiargs);
    836      1.1  mrg     DotTemplateInstanceExp(Loc loc, Expression *e, TemplateInstance *ti);
    837      1.1  mrg     Expression *syntaxCopy();
    838      1.1  mrg     bool findTempDecl(Scope *sc);
    839      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    840      1.1  mrg };
    841      1.1  mrg 
    842      1.1  mrg class DelegateExp : public UnaExp
    843      1.1  mrg {
    844      1.1  mrg public:
    845      1.1  mrg     FuncDeclaration *func;
    846      1.1  mrg     bool hasOverloads;
    847      1.1  mrg 
    848      1.1  mrg     DelegateExp(Loc loc, Expression *e, FuncDeclaration *func, bool hasOverloads = true);
    849      1.1  mrg 
    850      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    851      1.1  mrg };
    852      1.1  mrg 
    853      1.1  mrg class DotTypeExp : public UnaExp
    854      1.1  mrg {
    855      1.1  mrg public:
    856      1.1  mrg     Dsymbol *sym;               // symbol that represents a type
    857      1.1  mrg 
    858      1.1  mrg     DotTypeExp(Loc loc, Expression *e, Dsymbol *sym);
    859      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    860      1.1  mrg };
    861      1.1  mrg 
    862      1.1  mrg class CallExp : public UnaExp
    863      1.1  mrg {
    864      1.1  mrg public:
    865      1.1  mrg     Expressions *arguments;     // function arguments
    866      1.1  mrg     FuncDeclaration *f;         // symbol to call
    867      1.1  mrg     bool directcall;            // true if a virtual call is devirtualized
    868      1.1  mrg     CallExp(Loc loc, Expression *e, Expressions *exps);
    869      1.1  mrg     CallExp(Loc loc, Expression *e);
    870      1.1  mrg     CallExp(Loc loc, Expression *e, Expression *earg1);
    871      1.1  mrg     CallExp(Loc loc, Expression *e, Expression *earg1, Expression *earg2);
    872      1.1  mrg 
    873      1.1  mrg     static CallExp *create(Loc loc, Expression *e, Expressions *exps);
    874      1.1  mrg     static CallExp *create(Loc loc, Expression *e);
    875      1.1  mrg     static CallExp *create(Loc loc, Expression *e, Expression *earg1);
    876      1.1  mrg 
    877      1.1  mrg     Expression *syntaxCopy();
    878      1.1  mrg     bool isLvalue();
    879      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    880      1.1  mrg     Expression *addDtorHook(Scope *sc);
    881      1.1  mrg 
    882      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    883      1.1  mrg };
    884      1.1  mrg 
    885      1.1  mrg class AddrExp : public UnaExp
    886      1.1  mrg {
    887      1.1  mrg public:
    888      1.1  mrg     AddrExp(Loc loc, Expression *e);
    889      1.1  mrg     AddrExp(Loc loc, Expression *e, Type *t);
    890      1.1  mrg 
    891      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    892      1.1  mrg };
    893      1.1  mrg 
    894      1.1  mrg class PtrExp : public UnaExp
    895      1.1  mrg {
    896      1.1  mrg public:
    897      1.1  mrg     PtrExp(Loc loc, Expression *e);
    898      1.1  mrg     PtrExp(Loc loc, Expression *e, Type *t);
    899      1.1  mrg     int checkModifiable(Scope *sc, int flag);
    900      1.1  mrg     bool isLvalue();
    901      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    902      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
    903      1.1  mrg 
    904      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    905      1.1  mrg };
    906      1.1  mrg 
    907      1.1  mrg class NegExp : public UnaExp
    908      1.1  mrg {
    909      1.1  mrg public:
    910      1.1  mrg     NegExp(Loc loc, Expression *e);
    911      1.1  mrg 
    912      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    913      1.1  mrg };
    914      1.1  mrg 
    915      1.1  mrg class UAddExp : public UnaExp
    916      1.1  mrg {
    917      1.1  mrg public:
    918      1.1  mrg     UAddExp(Loc loc, Expression *e);
    919      1.1  mrg 
    920      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    921      1.1  mrg };
    922      1.1  mrg 
    923      1.1  mrg class ComExp : public UnaExp
    924      1.1  mrg {
    925      1.1  mrg public:
    926      1.1  mrg     ComExp(Loc loc, Expression *e);
    927      1.1  mrg 
    928      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    929      1.1  mrg };
    930      1.1  mrg 
    931      1.1  mrg class NotExp : public UnaExp
    932      1.1  mrg {
    933      1.1  mrg public:
    934      1.1  mrg     NotExp(Loc loc, Expression *e);
    935      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    936      1.1  mrg };
    937      1.1  mrg 
    938      1.1  mrg class DeleteExp : public UnaExp
    939      1.1  mrg {
    940      1.1  mrg public:
    941      1.1  mrg     bool isRAII;
    942      1.1  mrg     DeleteExp(Loc loc, Expression *e, bool isRAII);
    943      1.1  mrg     Expression *toBoolean(Scope *sc);
    944      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    945      1.1  mrg };
    946      1.1  mrg 
    947      1.1  mrg class CastExp : public UnaExp
    948      1.1  mrg {
    949      1.1  mrg public:
    950      1.1  mrg     // Possible to cast to one type while painting to another type
    951      1.1  mrg     Type *to;                   // type to cast to
    952      1.1  mrg     unsigned char mod;          // MODxxxxx
    953      1.1  mrg 
    954      1.1  mrg     CastExp(Loc loc, Expression *e, Type *t);
    955      1.1  mrg     CastExp(Loc loc, Expression *e, unsigned char mod);
    956      1.1  mrg     Expression *syntaxCopy();
    957      1.1  mrg 
    958      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    959      1.1  mrg };
    960      1.1  mrg 
    961      1.1  mrg class VectorExp : public UnaExp
    962      1.1  mrg {
    963      1.1  mrg public:
    964      1.1  mrg     TypeVector *to;             // the target vector type before semantic()
    965      1.1  mrg     unsigned dim;               // number of elements in the vector
    966      1.1  mrg     OwnedBy ownedByCtfe;
    967      1.1  mrg 
    968      1.1  mrg     VectorExp(Loc loc, Expression *e, Type *t);
    969      1.1  mrg     static VectorExp *create(Loc loc, Expression *e, Type *t);
    970      1.1  mrg     Expression *syntaxCopy();
    971      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    972      1.1  mrg };
    973      1.1  mrg 
    974      1.1  mrg class VectorArrayExp : public UnaExp
    975      1.1  mrg {
    976      1.1  mrg public:
    977      1.1  mrg     VectorArrayExp(Loc loc, Expression *e1);
    978      1.1  mrg     bool isLvalue();
    979      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    980      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
    981      1.1  mrg };
    982      1.1  mrg 
    983      1.1  mrg class SliceExp : public UnaExp
    984      1.1  mrg {
    985      1.1  mrg public:
    986      1.1  mrg     Expression *upr;            // NULL if implicit 0
    987      1.1  mrg     Expression *lwr;            // NULL if implicit [length - 1]
    988      1.1  mrg     VarDeclaration *lengthVar;
    989      1.1  mrg     bool upperIsInBounds;       // true if upr <= e1.length
    990      1.1  mrg     bool lowerIsLessThanUpper;  // true if lwr <= upr
    991      1.1  mrg     bool arrayop;               // an array operation, rather than a slice
    992      1.1  mrg 
    993      1.1  mrg     SliceExp(Loc loc, Expression *e1, IntervalExp *ie);
    994      1.1  mrg     SliceExp(Loc loc, Expression *e1, Expression *lwr, Expression *upr);
    995      1.1  mrg     Expression *syntaxCopy();
    996      1.1  mrg     int checkModifiable(Scope *sc, int flag);
    997      1.1  mrg     bool isLvalue();
    998      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
    999      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
   1000      1.1  mrg     bool isBool(bool result);
   1001      1.1  mrg 
   1002      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1003      1.1  mrg };
   1004      1.1  mrg 
   1005      1.1  mrg class ArrayLengthExp : public UnaExp
   1006      1.1  mrg {
   1007      1.1  mrg public:
   1008      1.1  mrg     ArrayLengthExp(Loc loc, Expression *e1);
   1009      1.1  mrg 
   1010      1.1  mrg     static Expression *rewriteOpAssign(BinExp *exp);
   1011      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1012      1.1  mrg };
   1013      1.1  mrg 
   1014      1.1  mrg class IntervalExp : public Expression
   1015      1.1  mrg {
   1016      1.1  mrg public:
   1017      1.1  mrg     Expression *lwr;
   1018      1.1  mrg     Expression *upr;
   1019      1.1  mrg 
   1020      1.1  mrg     IntervalExp(Loc loc, Expression *lwr, Expression *upr);
   1021      1.1  mrg     Expression *syntaxCopy();
   1022      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1023      1.1  mrg };
   1024      1.1  mrg 
   1025      1.1  mrg class DelegatePtrExp : public UnaExp
   1026      1.1  mrg {
   1027      1.1  mrg public:
   1028      1.1  mrg     DelegatePtrExp(Loc loc, Expression *e1);
   1029      1.1  mrg     bool isLvalue();
   1030      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
   1031      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
   1032      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1033      1.1  mrg };
   1034      1.1  mrg 
   1035      1.1  mrg class DelegateFuncptrExp : public UnaExp
   1036      1.1  mrg {
   1037      1.1  mrg public:
   1038      1.1  mrg     DelegateFuncptrExp(Loc loc, Expression *e1);
   1039      1.1  mrg     bool isLvalue();
   1040      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
   1041      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
   1042      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1043      1.1  mrg };
   1044      1.1  mrg 
   1045      1.1  mrg // e1[a0,a1,a2,a3,...]
   1046      1.1  mrg 
   1047      1.1  mrg class ArrayExp : public UnaExp
   1048      1.1  mrg {
   1049      1.1  mrg public:
   1050      1.1  mrg     Expressions *arguments;             // Array of Expression's
   1051      1.1  mrg     size_t currentDimension;            // for opDollar
   1052      1.1  mrg     VarDeclaration *lengthVar;
   1053      1.1  mrg 
   1054      1.1  mrg     ArrayExp(Loc loc, Expression *e1, Expression *index = NULL);
   1055      1.1  mrg     ArrayExp(Loc loc, Expression *e1, Expressions *args);
   1056      1.1  mrg     Expression *syntaxCopy();
   1057      1.1  mrg     bool isLvalue();
   1058      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
   1059      1.1  mrg 
   1060      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1061      1.1  mrg };
   1062      1.1  mrg 
   1063      1.1  mrg /****************************************************************/
   1064      1.1  mrg 
   1065      1.1  mrg class DotExp : public BinExp
   1066      1.1  mrg {
   1067      1.1  mrg public:
   1068      1.1  mrg     DotExp(Loc loc, Expression *e1, Expression *e2);
   1069      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1070      1.1  mrg };
   1071      1.1  mrg 
   1072      1.1  mrg class CommaExp : public BinExp
   1073      1.1  mrg {
   1074      1.1  mrg public:
   1075      1.1  mrg     bool isGenerated;
   1076      1.1  mrg     bool allowCommaExp;
   1077      1.1  mrg     CommaExp(Loc loc, Expression *e1, Expression *e2, bool generated = true);
   1078      1.1  mrg     int checkModifiable(Scope *sc, int flag);
   1079      1.1  mrg     bool isLvalue();
   1080      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
   1081      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
   1082      1.1  mrg     bool isBool(bool result);
   1083      1.1  mrg     Expression *toBoolean(Scope *sc);
   1084      1.1  mrg     Expression *addDtorHook(Scope *sc);
   1085      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1086      1.1  mrg };
   1087      1.1  mrg 
   1088      1.1  mrg class IndexExp : public BinExp
   1089      1.1  mrg {
   1090      1.1  mrg public:
   1091      1.1  mrg     VarDeclaration *lengthVar;
   1092      1.1  mrg     bool modifiable;
   1093      1.1  mrg     bool indexIsInBounds;       // true if 0 <= e2 && e2 <= e1.length - 1
   1094      1.1  mrg 
   1095      1.1  mrg     IndexExp(Loc loc, Expression *e1, Expression *e2);
   1096      1.1  mrg     Expression *syntaxCopy();
   1097      1.1  mrg     int checkModifiable(Scope *sc, int flag);
   1098      1.1  mrg     bool isLvalue();
   1099      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
   1100      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
   1101      1.1  mrg 
   1102      1.1  mrg     Expression *markSettingAAElem();
   1103      1.1  mrg 
   1104      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1105      1.1  mrg };
   1106      1.1  mrg 
   1107      1.1  mrg /* For both i++ and i--
   1108      1.1  mrg  */
   1109      1.1  mrg class PostExp : public BinExp
   1110      1.1  mrg {
   1111      1.1  mrg public:
   1112      1.1  mrg     PostExp(TOK op, Loc loc, Expression *e);
   1113      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1114      1.1  mrg };
   1115      1.1  mrg 
   1116      1.1  mrg /* For both ++i and --i
   1117      1.1  mrg  */
   1118      1.1  mrg class PreExp : public UnaExp
   1119      1.1  mrg {
   1120      1.1  mrg public:
   1121      1.1  mrg     PreExp(TOK op, Loc loc, Expression *e);
   1122      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1123      1.1  mrg };
   1124      1.1  mrg 
   1125      1.1  mrg enum MemorySet
   1126      1.1  mrg {
   1127      1.1  mrg     blockAssign     = 1,    // setting the contents of an array
   1128      1.1  mrg     referenceInit   = 2     // setting the reference of STCref variable
   1129      1.1  mrg };
   1130      1.1  mrg 
   1131      1.1  mrg class AssignExp : public BinExp
   1132      1.1  mrg {
   1133      1.1  mrg public:
   1134      1.1  mrg     int memset;         // combination of MemorySet flags
   1135      1.1  mrg 
   1136      1.1  mrg     AssignExp(Loc loc, Expression *e1, Expression *e2);
   1137      1.1  mrg     bool isLvalue();
   1138      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *ex);
   1139      1.1  mrg     Expression *toBoolean(Scope *sc);
   1140      1.1  mrg 
   1141      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1142      1.1  mrg };
   1143      1.1  mrg 
   1144      1.1  mrg class ConstructExp : public AssignExp
   1145      1.1  mrg {
   1146      1.1  mrg public:
   1147      1.1  mrg     ConstructExp(Loc loc, Expression *e1, Expression *e2);
   1148      1.1  mrg     ConstructExp(Loc loc, VarDeclaration *v, Expression *e2);
   1149      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1150      1.1  mrg };
   1151      1.1  mrg 
   1152      1.1  mrg class BlitExp : public AssignExp
   1153      1.1  mrg {
   1154      1.1  mrg public:
   1155      1.1  mrg     BlitExp(Loc loc, Expression *e1, Expression *e2);
   1156      1.1  mrg     BlitExp(Loc loc, VarDeclaration *v, Expression *e2);
   1157      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1158      1.1  mrg };
   1159      1.1  mrg 
   1160      1.1  mrg class AddAssignExp : public BinAssignExp
   1161      1.1  mrg {
   1162      1.1  mrg public:
   1163      1.1  mrg     AddAssignExp(Loc loc, Expression *e1, Expression *e2);
   1164      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1165      1.1  mrg };
   1166      1.1  mrg 
   1167      1.1  mrg class MinAssignExp : public BinAssignExp
   1168      1.1  mrg {
   1169      1.1  mrg public:
   1170      1.1  mrg     MinAssignExp(Loc loc, Expression *e1, Expression *e2);
   1171      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1172      1.1  mrg };
   1173      1.1  mrg 
   1174      1.1  mrg class MulAssignExp : public BinAssignExp
   1175      1.1  mrg {
   1176      1.1  mrg public:
   1177      1.1  mrg     MulAssignExp(Loc loc, Expression *e1, Expression *e2);
   1178      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1179      1.1  mrg };
   1180      1.1  mrg 
   1181      1.1  mrg class DivAssignExp : public BinAssignExp
   1182      1.1  mrg {
   1183      1.1  mrg public:
   1184      1.1  mrg     DivAssignExp(Loc loc, Expression *e1, Expression *e2);
   1185      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1186      1.1  mrg };
   1187      1.1  mrg 
   1188      1.1  mrg class ModAssignExp : public BinAssignExp
   1189      1.1  mrg {
   1190      1.1  mrg public:
   1191      1.1  mrg     ModAssignExp(Loc loc, Expression *e1, Expression *e2);
   1192      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1193      1.1  mrg };
   1194      1.1  mrg 
   1195      1.1  mrg class AndAssignExp : public BinAssignExp
   1196      1.1  mrg {
   1197      1.1  mrg public:
   1198      1.1  mrg     AndAssignExp(Loc loc, Expression *e1, Expression *e2);
   1199      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1200      1.1  mrg };
   1201      1.1  mrg 
   1202      1.1  mrg class OrAssignExp : public BinAssignExp
   1203      1.1  mrg {
   1204      1.1  mrg public:
   1205      1.1  mrg     OrAssignExp(Loc loc, Expression *e1, Expression *e2);
   1206      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1207      1.1  mrg };
   1208      1.1  mrg 
   1209      1.1  mrg class XorAssignExp : public BinAssignExp
   1210      1.1  mrg {
   1211      1.1  mrg public:
   1212      1.1  mrg     XorAssignExp(Loc loc, Expression *e1, Expression *e2);
   1213      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1214      1.1  mrg };
   1215      1.1  mrg 
   1216      1.1  mrg class PowAssignExp : public BinAssignExp
   1217      1.1  mrg {
   1218      1.1  mrg public:
   1219      1.1  mrg     PowAssignExp(Loc loc, Expression *e1, Expression *e2);
   1220      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1221      1.1  mrg };
   1222      1.1  mrg 
   1223      1.1  mrg class ShlAssignExp : public BinAssignExp
   1224      1.1  mrg {
   1225      1.1  mrg public:
   1226      1.1  mrg     ShlAssignExp(Loc loc, Expression *e1, Expression *e2);
   1227      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1228      1.1  mrg };
   1229      1.1  mrg 
   1230      1.1  mrg class ShrAssignExp : public BinAssignExp
   1231      1.1  mrg {
   1232      1.1  mrg public:
   1233      1.1  mrg     ShrAssignExp(Loc loc, Expression *e1, Expression *e2);
   1234      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1235      1.1  mrg };
   1236      1.1  mrg 
   1237      1.1  mrg class UshrAssignExp : public BinAssignExp
   1238      1.1  mrg {
   1239      1.1  mrg public:
   1240      1.1  mrg     UshrAssignExp(Loc loc, Expression *e1, Expression *e2);
   1241      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1242      1.1  mrg };
   1243      1.1  mrg 
   1244      1.1  mrg class CatAssignExp : public BinAssignExp
   1245      1.1  mrg {
   1246      1.1  mrg public:
   1247      1.1  mrg     CatAssignExp(Loc loc, Expression *e1, Expression *e2);
   1248      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1249      1.1  mrg };
   1250      1.1  mrg 
   1251      1.1  mrg class AddExp : public BinExp
   1252      1.1  mrg {
   1253      1.1  mrg public:
   1254      1.1  mrg     AddExp(Loc loc, Expression *e1, Expression *e2);
   1255      1.1  mrg 
   1256      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1257      1.1  mrg };
   1258      1.1  mrg 
   1259      1.1  mrg class MinExp : public BinExp
   1260      1.1  mrg {
   1261      1.1  mrg public:
   1262      1.1  mrg     MinExp(Loc loc, Expression *e1, Expression *e2);
   1263      1.1  mrg 
   1264      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1265      1.1  mrg };
   1266      1.1  mrg 
   1267      1.1  mrg class CatExp : public BinExp
   1268      1.1  mrg {
   1269      1.1  mrg public:
   1270      1.1  mrg     CatExp(Loc loc, Expression *e1, Expression *e2);
   1271      1.1  mrg 
   1272      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1273      1.1  mrg };
   1274      1.1  mrg 
   1275      1.1  mrg class MulExp : public BinExp
   1276      1.1  mrg {
   1277      1.1  mrg public:
   1278      1.1  mrg     MulExp(Loc loc, Expression *e1, Expression *e2);
   1279      1.1  mrg 
   1280      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1281      1.1  mrg };
   1282      1.1  mrg 
   1283      1.1  mrg class DivExp : public BinExp
   1284      1.1  mrg {
   1285      1.1  mrg public:
   1286      1.1  mrg     DivExp(Loc loc, Expression *e1, Expression *e2);
   1287      1.1  mrg 
   1288      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1289      1.1  mrg };
   1290      1.1  mrg 
   1291      1.1  mrg class ModExp : public BinExp
   1292      1.1  mrg {
   1293      1.1  mrg public:
   1294      1.1  mrg     ModExp(Loc loc, Expression *e1, Expression *e2);
   1295      1.1  mrg 
   1296      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1297      1.1  mrg };
   1298      1.1  mrg 
   1299      1.1  mrg class PowExp : public BinExp
   1300      1.1  mrg {
   1301      1.1  mrg public:
   1302      1.1  mrg     PowExp(Loc loc, Expression *e1, Expression *e2);
   1303      1.1  mrg 
   1304      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1305      1.1  mrg };
   1306      1.1  mrg 
   1307      1.1  mrg class ShlExp : public BinExp
   1308      1.1  mrg {
   1309      1.1  mrg public:
   1310      1.1  mrg     ShlExp(Loc loc, Expression *e1, Expression *e2);
   1311      1.1  mrg 
   1312      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1313      1.1  mrg };
   1314      1.1  mrg 
   1315      1.1  mrg class ShrExp : public BinExp
   1316      1.1  mrg {
   1317      1.1  mrg public:
   1318      1.1  mrg     ShrExp(Loc loc, Expression *e1, Expression *e2);
   1319      1.1  mrg 
   1320      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1321      1.1  mrg };
   1322      1.1  mrg 
   1323      1.1  mrg class UshrExp : public BinExp
   1324      1.1  mrg {
   1325      1.1  mrg public:
   1326      1.1  mrg     UshrExp(Loc loc, Expression *e1, Expression *e2);
   1327      1.1  mrg 
   1328      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1329      1.1  mrg };
   1330      1.1  mrg 
   1331      1.1  mrg class AndExp : public BinExp
   1332      1.1  mrg {
   1333      1.1  mrg public:
   1334      1.1  mrg     AndExp(Loc loc, Expression *e1, Expression *e2);
   1335      1.1  mrg 
   1336      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1337      1.1  mrg };
   1338      1.1  mrg 
   1339      1.1  mrg class OrExp : public BinExp
   1340      1.1  mrg {
   1341      1.1  mrg public:
   1342      1.1  mrg     OrExp(Loc loc, Expression *e1, Expression *e2);
   1343      1.1  mrg 
   1344      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1345      1.1  mrg };
   1346      1.1  mrg 
   1347      1.1  mrg class XorExp : public BinExp
   1348      1.1  mrg {
   1349      1.1  mrg public:
   1350      1.1  mrg     XorExp(Loc loc, Expression *e1, Expression *e2);
   1351      1.1  mrg 
   1352      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1353      1.1  mrg };
   1354      1.1  mrg 
   1355      1.1  mrg class OrOrExp : public BinExp
   1356      1.1  mrg {
   1357      1.1  mrg public:
   1358      1.1  mrg     OrOrExp(Loc loc, Expression *e1, Expression *e2);
   1359      1.1  mrg     Expression *toBoolean(Scope *sc);
   1360      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1361      1.1  mrg };
   1362      1.1  mrg 
   1363      1.1  mrg class AndAndExp : public BinExp
   1364      1.1  mrg {
   1365      1.1  mrg public:
   1366      1.1  mrg     AndAndExp(Loc loc, Expression *e1, Expression *e2);
   1367      1.1  mrg     Expression *toBoolean(Scope *sc);
   1368      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1369      1.1  mrg };
   1370      1.1  mrg 
   1371      1.1  mrg class CmpExp : public BinExp
   1372      1.1  mrg {
   1373      1.1  mrg public:
   1374      1.1  mrg     CmpExp(TOK op, Loc loc, Expression *e1, Expression *e2);
   1375      1.1  mrg 
   1376      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1377      1.1  mrg };
   1378      1.1  mrg 
   1379      1.1  mrg class InExp : public BinExp
   1380      1.1  mrg {
   1381      1.1  mrg public:
   1382      1.1  mrg     InExp(Loc loc, Expression *e1, Expression *e2);
   1383      1.1  mrg 
   1384      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1385      1.1  mrg };
   1386      1.1  mrg 
   1387      1.1  mrg class RemoveExp : public BinExp
   1388      1.1  mrg {
   1389      1.1  mrg public:
   1390      1.1  mrg     RemoveExp(Loc loc, Expression *e1, Expression *e2);
   1391      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1392      1.1  mrg };
   1393      1.1  mrg 
   1394      1.1  mrg // == and !=
   1395      1.1  mrg 
   1396      1.1  mrg class EqualExp : public BinExp
   1397      1.1  mrg {
   1398      1.1  mrg public:
   1399      1.1  mrg     EqualExp(TOK op, Loc loc, Expression *e1, Expression *e2);
   1400      1.1  mrg 
   1401      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1402      1.1  mrg };
   1403      1.1  mrg 
   1404      1.1  mrg // is and !is
   1405      1.1  mrg 
   1406      1.1  mrg class IdentityExp : public BinExp
   1407      1.1  mrg {
   1408      1.1  mrg public:
   1409      1.1  mrg     IdentityExp(TOK op, Loc loc, Expression *e1, Expression *e2);
   1410      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1411      1.1  mrg };
   1412      1.1  mrg 
   1413      1.1  mrg /****************************************************************/
   1414      1.1  mrg 
   1415      1.1  mrg class CondExp : public BinExp
   1416      1.1  mrg {
   1417      1.1  mrg public:
   1418      1.1  mrg     Expression *econd;
   1419      1.1  mrg 
   1420      1.1  mrg     CondExp(Loc loc, Expression *econd, Expression *e1, Expression *e2);
   1421      1.1  mrg     Expression *syntaxCopy();
   1422      1.1  mrg     int checkModifiable(Scope *sc, int flag);
   1423      1.1  mrg     bool isLvalue();
   1424      1.1  mrg     Expression *toLvalue(Scope *sc, Expression *e);
   1425      1.1  mrg     Expression *modifiableLvalue(Scope *sc, Expression *e);
   1426      1.1  mrg     Expression *toBoolean(Scope *sc);
   1427      1.1  mrg     void hookDtors(Scope *sc);
   1428      1.1  mrg 
   1429      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1430      1.1  mrg };
   1431      1.1  mrg 
   1432      1.1  mrg /****************************************************************/
   1433      1.1  mrg 
   1434      1.1  mrg class DefaultInitExp : public Expression
   1435      1.1  mrg {
   1436      1.1  mrg public:
   1437      1.1  mrg     TOK subop;             // which of the derived classes this is
   1438      1.1  mrg 
   1439      1.1  mrg     DefaultInitExp(Loc loc, TOK subop, int size);
   1440      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1441      1.1  mrg };
   1442      1.1  mrg 
   1443      1.1  mrg class FileInitExp : public DefaultInitExp
   1444      1.1  mrg {
   1445      1.1  mrg public:
   1446      1.1  mrg     FileInitExp(Loc loc, TOK tok);
   1447      1.1  mrg     Expression *resolveLoc(Loc loc, Scope *sc);
   1448      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1449      1.1  mrg };
   1450      1.1  mrg 
   1451      1.1  mrg class LineInitExp : public DefaultInitExp
   1452      1.1  mrg {
   1453      1.1  mrg public:
   1454      1.1  mrg     LineInitExp(Loc loc);
   1455      1.1  mrg     Expression *resolveLoc(Loc loc, Scope *sc);
   1456      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1457      1.1  mrg };
   1458      1.1  mrg 
   1459      1.1  mrg class ModuleInitExp : public DefaultInitExp
   1460      1.1  mrg {
   1461      1.1  mrg public:
   1462      1.1  mrg     ModuleInitExp(Loc loc);
   1463      1.1  mrg     Expression *resolveLoc(Loc loc, Scope *sc);
   1464      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1465      1.1  mrg };
   1466      1.1  mrg 
   1467      1.1  mrg class FuncInitExp : public DefaultInitExp
   1468      1.1  mrg {
   1469      1.1  mrg public:
   1470      1.1  mrg     FuncInitExp(Loc loc);
   1471      1.1  mrg     Expression *resolveLoc(Loc loc, Scope *sc);
   1472      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1473      1.1  mrg };
   1474      1.1  mrg 
   1475      1.1  mrg class PrettyFuncInitExp : public DefaultInitExp
   1476      1.1  mrg {
   1477      1.1  mrg public:
   1478      1.1  mrg     PrettyFuncInitExp(Loc loc);
   1479      1.1  mrg     Expression *resolveLoc(Loc loc, Scope *sc);
   1480      1.1  mrg     void accept(Visitor *v) { v->visit(this); }
   1481      1.1  mrg };
   1482      1.1  mrg 
   1483      1.1  mrg /****************************************************************/
   1484      1.1  mrg 
   1485      1.1  mrg /* A type meant as a union of all the Expression types,
   1486      1.1  mrg  * to serve essentially as a Variant that will sit on the stack
   1487      1.1  mrg  * during CTFE to reduce memory consumption.
   1488      1.1  mrg  */
   1489      1.1  mrg struct UnionExp
   1490      1.1  mrg {
   1491      1.1  mrg     UnionExp() { }  // yes, default constructor does nothing
   1492      1.1  mrg 
   1493      1.1  mrg     UnionExp(Expression *e)
   1494      1.1  mrg     {
   1495      1.1  mrg         memcpy(this, (void *)e, e->size);
   1496      1.1  mrg     }
   1497      1.1  mrg 
   1498      1.1  mrg     /* Extract pointer to Expression
   1499      1.1  mrg      */
   1500      1.1  mrg     Expression *exp() { return (Expression *)&u; }
   1501      1.1  mrg 
   1502      1.1  mrg     /* Convert to an allocated Expression
   1503      1.1  mrg      */
   1504      1.1  mrg     Expression *copy();
   1505      1.1  mrg 
   1506      1.1  mrg private:
   1507      1.1  mrg     // Ensure that the union is suitably aligned.
   1508      1.1  mrg #if defined(__GNUC__) || defined(__clang__)
   1509      1.1  mrg     __attribute__((aligned(8)))
   1510      1.1  mrg #elif defined(_MSC_VER)
   1511      1.1  mrg     __declspec(align(8))
   1512      1.1  mrg #elif defined(__DMC__)
   1513      1.1  mrg     #pragma pack(8)
   1514      1.1  mrg #endif
   1515      1.1  mrg     union
   1516      1.1  mrg     {
   1517      1.1  mrg         char exp       [sizeof(Expression)];
   1518      1.1  mrg         char integerexp[sizeof(IntegerExp)];
   1519      1.1  mrg         char errorexp  [sizeof(ErrorExp)];
   1520      1.1  mrg         char realexp   [sizeof(RealExp)];
   1521      1.1  mrg         char complexexp[sizeof(ComplexExp)];
   1522      1.1  mrg         char symoffexp [sizeof(SymOffExp)];
   1523      1.1  mrg         char stringexp [sizeof(StringExp)];
   1524      1.1  mrg         char arrayliteralexp [sizeof(ArrayLiteralExp)];
   1525      1.1  mrg         char assocarrayliteralexp [sizeof(AssocArrayLiteralExp)];
   1526      1.1  mrg         char structliteralexp [sizeof(StructLiteralExp)];
   1527      1.1  mrg         char nullexp   [sizeof(NullExp)];
   1528      1.1  mrg         char dotvarexp [sizeof(DotVarExp)];
   1529      1.1  mrg         char addrexp   [sizeof(AddrExp)];
   1530      1.1  mrg         char indexexp  [sizeof(IndexExp)];
   1531      1.1  mrg         char sliceexp  [sizeof(SliceExp)];
   1532      1.1  mrg         char vectorexp [sizeof(VectorExp)];
   1533      1.1  mrg     } u;
   1534      1.1  mrg #if defined(__DMC__)
   1535      1.1  mrg     #pragma pack()
   1536      1.1  mrg #endif
   1537      1.1  mrg };
   1538      1.1  mrg 
   1539      1.1  mrg /****************************************************************/
   1540      1.1  mrg 
   1541      1.1  mrg /* Special values used by the interpreter
   1542      1.1  mrg  */
   1543      1.1  mrg 
   1544      1.1  mrg Expression *expType(Type *type, Expression *e);
   1545      1.1  mrg 
   1546      1.1  mrg UnionExp Neg(Type *type, Expression *e1);
   1547      1.1  mrg UnionExp Com(Type *type, Expression *e1);
   1548      1.1  mrg UnionExp Not(Type *type, Expression *e1);
   1549      1.1  mrg UnionExp Bool(Type *type, Expression *e1);
   1550      1.1  mrg UnionExp Cast(Loc loc, Type *type, Type *to, Expression *e1);
   1551      1.1  mrg UnionExp ArrayLength(Type *type, Expression *e1);
   1552      1.1  mrg UnionExp Ptr(Type *type, Expression *e1);
   1553      1.1  mrg 
   1554      1.1  mrg UnionExp Add(Loc loc, Type *type, Expression *e1, Expression *e2);
   1555      1.1  mrg UnionExp Min(Loc loc, Type *type, Expression *e1, Expression *e2);
   1556      1.1  mrg UnionExp Mul(Loc loc, Type *type, Expression *e1, Expression *e2);
   1557      1.1  mrg UnionExp Div(Loc loc, Type *type, Expression *e1, Expression *e2);
   1558      1.1  mrg UnionExp Mod(Loc loc, Type *type, Expression *e1, Expression *e2);
   1559      1.1  mrg UnionExp Pow(Loc loc, Type *type, Expression *e1, Expression *e2);
   1560      1.1  mrg UnionExp Shl(Loc loc, Type *type, Expression *e1, Expression *e2);
   1561      1.1  mrg UnionExp Shr(Loc loc, Type *type, Expression *e1, Expression *e2);
   1562      1.1  mrg UnionExp Ushr(Loc loc, Type *type, Expression *e1, Expression *e2);
   1563      1.1  mrg UnionExp And(Loc loc, Type *type, Expression *e1, Expression *e2);
   1564      1.1  mrg UnionExp Or(Loc loc, Type *type, Expression *e1, Expression *e2);
   1565      1.1  mrg UnionExp Xor(Loc loc, Type *type, Expression *e1, Expression *e2);
   1566      1.1  mrg UnionExp Index(Type *type, Expression *e1, Expression *e2);
   1567      1.1  mrg UnionExp Cat(Type *type, Expression *e1, Expression *e2);
   1568      1.1  mrg 
   1569      1.1  mrg UnionExp Equal(TOK op, Loc loc, Type *type, Expression *e1, Expression *e2);
   1570      1.1  mrg UnionExp Cmp(TOK op, Loc loc, Type *type, Expression *e1, Expression *e2);
   1571      1.1  mrg UnionExp Identity(TOK op, Loc loc, Type *type, Expression *e1, Expression *e2);
   1572      1.1  mrg 
   1573      1.1  mrg UnionExp Slice(Type *type, Expression *e1, Expression *lwr, Expression *upr);
   1574      1.1  mrg 
   1575      1.1  mrg // Const-folding functions used by CTFE
   1576      1.1  mrg 
   1577      1.1  mrg void sliceAssignArrayLiteralFromString(ArrayLiteralExp *existingAE, StringExp *newval, size_t firstIndex);
   1578      1.1  mrg void sliceAssignStringFromArrayLiteral(StringExp *existingSE, ArrayLiteralExp *newae, size_t firstIndex);
   1579      1.1  mrg void sliceAssignStringFromString(StringExp *existingSE, StringExp *newstr, size_t firstIndex);
   1580      1.1  mrg 
   1581      1.1  mrg int sliceCmpStringWithString(StringExp *se1, StringExp *se2, size_t lo1, size_t lo2, size_t len);
   1582      1.1  mrg int sliceCmpStringWithArray(StringExp *se1, ArrayLiteralExp *ae2, size_t lo1, size_t lo2, size_t len);
   1583