2 /* Compiler implementation of the D programming language
3 * Copyright (C) 1999-2023 by The D Language Foundation, All Rights Reserved
4 * written by Walter Bright
5 * https://www.digitalmars.com
6 * Distributed under the Boost Software License, Version 1.0.
7 * https://www.boost.org/LICENSE_1_0.txt
8 * https://github.com/dlang/dmd/blob/master/src/dmd/expression.h
15 #include "arraytypes.h"
19 #include "root/complex_t.h"
20 #include "root/dcompat.h"
21 #include "root/optional.h"
26 class TupleDeclaration
;
28 class FuncDeclaration
;
29 class FuncLiteralDeclaration
;
30 class CtorDeclaration
;
35 class StructDeclaration
;
36 class TemplateInstance
;
37 class TemplateDeclaration
;
38 class ClassDeclaration
;
41 class LoweredAssignExp
;
43 typedef union tree_node Symbol
;
45 struct Symbol
; // back end symbol
48 // Entry point for CTFE.
49 // A compile-time result is required. Give an error if not possible
50 Expression
*ctfeInterpret(Expression
*e
);
51 void expandTuples(Expressions
*exps
, Identifiers
*names
= nullptr);
52 StringExp
*toUTF8(StringExp
*se
, Scope
*sc
);
53 Expression
*resolveLoc(Expression
*exp
, const Loc
&loc
, Scope
*sc
);
54 MATCH
implicitConvTo(Expression
*e
, Type
*t
);
55 Expression
*toLvalue(Expression
*_this
, Scope
*sc
, const char* action
);
56 Expression
*modifiableLvalue(Expression
* exp
, Scope
*sc
);
58 typedef unsigned char OwnedBy
;
61 OWNEDcode
, // normal code expression in AST
62 OWNEDctfe
, // value expression for CTFE
63 OWNEDcache
// constant value cached for CTFE
66 #define WANTvalue 0 // default
67 #define WANTexpand 1 // expand const/immutable variables if possible
70 * Specifies how the checkModify deals with certain situations
72 enum class ModifyFlags
74 /// Issue error messages on invalid modifications of the variable
76 /// No errors are emitted for invalid modifications
78 /// The modification occurs for a subfield of the current variable
82 class Expression
: public ASTNode
85 Type
*type
; // !=NULL means that semantic() has been run
86 Loc loc
; // file location
87 EXP op
; // to minimize use of dynamic_cast
91 virtual Expression
*syntaxCopy();
93 // kludge for template.isExpression()
94 DYNCAST
dyncast() const override final
{ return DYNCAST_EXPRESSION
; }
96 const char *toChars() const override
;
98 virtual dinteger_t
toInteger();
99 virtual uinteger_t
toUInteger();
100 virtual real_t
toReal();
101 virtual real_t
toImaginary();
102 virtual complex_t
toComplex();
103 virtual StringExp
*toStringExp();
104 virtual bool isLvalue();
105 virtual bool checkType();
106 virtual bool checkValue();
107 Expression
*addressOf();
110 Expression
*optimize(int result
, bool keepLvalue
= false);
113 virtual bool isIdentical(const Expression
*e
) const;
114 virtual Optional
<bool> toBool();
115 virtual bool hasCode()
120 IntegerExp
* isIntegerExp();
121 ErrorExp
* isErrorExp();
122 VoidInitExp
* isVoidInitExp();
123 RealExp
* isRealExp();
124 ComplexExp
* isComplexExp();
125 IdentifierExp
* isIdentifierExp();
126 DollarExp
* isDollarExp();
127 DsymbolExp
* isDsymbolExp();
128 ThisExp
* isThisExp();
129 SuperExp
* isSuperExp();
130 NullExp
* isNullExp();
131 StringExp
* isStringExp();
132 TupleExp
* isTupleExp();
133 ArrayLiteralExp
* isArrayLiteralExp();
134 AssocArrayLiteralExp
* isAssocArrayLiteralExp();
135 StructLiteralExp
* isStructLiteralExp();
136 TypeExp
* isTypeExp();
137 ScopeExp
* isScopeExp();
138 TemplateExp
* isTemplateExp();
140 NewAnonClassExp
* isNewAnonClassExp();
141 SymOffExp
* isSymOffExp();
143 OverExp
* isOverExp();
144 FuncExp
* isFuncExp();
145 DeclarationExp
* isDeclarationExp();
146 TypeidExp
* isTypeidExp();
147 TraitsExp
* isTraitsExp();
148 HaltExp
* isHaltExp();
150 MixinExp
* isMixinExp();
151 ImportExp
* isImportExp();
152 AssertExp
* isAssertExp();
153 DotIdExp
* isDotIdExp();
154 DotTemplateExp
* isDotTemplateExp();
155 DotVarExp
* isDotVarExp();
156 DotTemplateInstanceExp
* isDotTemplateInstanceExp();
157 DelegateExp
* isDelegateExp();
158 DotTypeExp
* isDotTypeExp();
159 CallExp
* isCallExp();
160 AddrExp
* isAddrExp();
163 UAddExp
* isUAddExp();
166 DeleteExp
* isDeleteExp();
167 CastExp
* isCastExp();
168 VectorExp
* isVectorExp();
169 VectorArrayExp
* isVectorArrayExp();
170 SliceExp
* isSliceExp();
171 ArrayLengthExp
* isArrayLengthExp();
172 ArrayExp
* isArrayExp();
174 CommaExp
* isCommaExp();
175 IntervalExp
* isIntervalExp();
176 DelegatePtrExp
* isDelegatePtrExp();
177 DelegateFuncptrExp
* isDelegateFuncptrExp();
178 IndexExp
* isIndexExp();
179 PostExp
* isPostExp();
181 AssignExp
* isAssignExp();
182 ConstructExp
* isConstructExp();
183 BlitExp
* isBlitExp();
184 AddAssignExp
* isAddAssignExp();
185 MinAssignExp
* isMinAssignExp();
186 MulAssignExp
* isMulAssignExp();
187 DivAssignExp
* isDivAssignExp();
188 ModAssignExp
* isModAssignExp();
189 AndAssignExp
* isAndAssignExp();
190 OrAssignExp
* isOrAssignExp();
191 XorAssignExp
* isXorAssignExp();
192 PowAssignExp
* isPowAssignExp();
193 ShlAssignExp
* isShlAssignExp();
194 ShrAssignExp
* isShrAssignExp();
195 UshrAssignExp
* isUshrAssignExp();
196 CatAssignExp
* isCatAssignExp();
197 CatElemAssignExp
* isCatElemAssignExp();
198 CatDcharAssignExp
* isCatDcharAssignExp();
208 UshrExp
* isUshrExp();
212 LogicalExp
* isLogicalExp();
214 RemoveExp
* isRemoveExp();
215 EqualExp
* isEqualExp();
216 IdentityExp
* isIdentityExp();
217 CondExp
* isCondExp();
218 GenericExp
* isGenericExp();
219 DefaultInitExp
* isDefaultInitExp();
220 FileInitExp
* isFileInitExp();
221 LineInitExp
* isLineInitExp();
222 ModuleInitExp
* isModuleInitExp();
223 FuncInitExp
* isFuncInitExp();
224 PrettyFuncInitExp
* isPrettyFuncInitExp();
225 ClassReferenceExp
* isClassReferenceExp();
226 ThrownExceptionExp
* isThrownExceptionExp();
229 BinAssignExp
* isBinAssignExp();
230 LoweredAssignExp
* isLoweredAssignExp();
232 void accept(Visitor
*v
) override
{ v
->visit(this); }
235 class IntegerExp final
: public Expression
240 static IntegerExp
*create(const Loc
&loc
, dinteger_t value
, Type
*type
);
241 bool equals(const RootObject
* const o
) const override
;
242 dinteger_t
toInteger() override
;
243 real_t
toReal() override
;
244 real_t
toImaginary() override
;
245 complex_t
toComplex() override
;
246 Optional
<bool> toBool() override
;
247 void accept(Visitor
*v
) override
{ v
->visit(this); }
248 dinteger_t
getInteger() { return value
; }
250 static IntegerExp
literal();
253 class ErrorExp final
: public Expression
256 void accept(Visitor
*v
) override
{ v
->visit(this); }
258 static ErrorExp
*errorexp
; // handy shared value
261 class RealExp final
: public Expression
266 static RealExp
*create(const Loc
&loc
, real_t value
, Type
*type
);
267 bool equals(const RootObject
* const o
) const override
;
268 bool isIdentical(const Expression
*e
) const override
;
269 dinteger_t
toInteger() override
;
270 uinteger_t
toUInteger() override
;
271 real_t
toReal() override
;
272 real_t
toImaginary() override
;
273 complex_t
toComplex() override
;
274 Optional
<bool> toBool() override
;
275 void accept(Visitor
*v
) override
{ v
->visit(this); }
278 class ComplexExp final
: public Expression
283 static ComplexExp
*create(const Loc
&loc
, complex_t value
, Type
*type
);
284 bool equals(const RootObject
* const o
) const override
;
285 bool isIdentical(const Expression
*e
) const override
;
286 dinteger_t
toInteger() override
;
287 uinteger_t
toUInteger() override
;
288 real_t
toReal() override
;
289 real_t
toImaginary() override
;
290 complex_t
toComplex() override
;
291 Optional
<bool> toBool() override
;
292 void accept(Visitor
*v
) override
{ v
->visit(this); }
295 class IdentifierExp
: public Expression
301 static IdentifierExp
*create(const Loc
&loc
, Identifier
*ident
);
302 bool isLvalue() override final
;
303 void accept(Visitor
*v
) override
{ v
->visit(this); }
306 class DollarExp final
: public IdentifierExp
309 void accept(Visitor
*v
) override
{ v
->visit(this); }
312 class DsymbolExp final
: public Expression
318 DsymbolExp
*syntaxCopy() override
;
319 bool isLvalue() override
;
320 void accept(Visitor
*v
) override
{ v
->visit(this); }
323 class ThisExp
: public Expression
328 ThisExp
*syntaxCopy() override
;
329 Optional
<bool> toBool() override
;
330 bool isLvalue() override
;
332 void accept(Visitor
*v
) override
{ v
->visit(this); }
335 class SuperExp final
: public ThisExp
338 void accept(Visitor
*v
) override
{ v
->visit(this); }
341 class NullExp final
: public Expression
344 bool equals(const RootObject
* const o
) const override
;
345 Optional
<bool> toBool() override
;
346 StringExp
*toStringExp() override
;
347 void accept(Visitor
*v
) override
{ v
->visit(this); }
350 class StringExp final
: public Expression
353 utf8_t postfix
; // 'c', 'w', 'd'
355 void *string
; // char, wchar, or dchar data
356 size_t len
; // number of chars, wchars, or dchars
357 unsigned char sz
; // 1: char, 2: wchar, 4: dchar
358 d_bool committed
; // if type is committed
359 d_bool hexString
; // if string is parsed from a hex string literal
361 static StringExp
*create(const Loc
&loc
, const char *s
);
362 static StringExp
*create(const Loc
&loc
, const void *s
, d_size_t len
);
363 bool equals(const RootObject
* const o
) const override
;
364 char32_t
getCodeUnit(d_size_t i
) const;
365 StringExp
*toStringExp() override
;
366 Optional
<bool> toBool() override
;
367 bool isLvalue() override
;
368 void accept(Visitor
*v
) override
{ v
->visit(this); }
369 size_t numberOfCodeUnits(int tynto
= 0) const;
370 void writeTo(void* dest
, bool zero
, int tyto
= 0) const;
375 class TupleExp final
: public Expression
378 Expression
*e0
; // side-effect part
379 /* Tuple-field access may need to take out its side effect part.
383 * (ref __tup = foo(); tuple(__tup.field0, __tup.field1, ...))
384 * The declaration of temporary variable __tup will be stored in TupleExp::e0.
388 static TupleExp
*create(const Loc
&loc
, Expressions
*exps
);
389 TupleExp
*syntaxCopy() override
;
390 bool equals(const RootObject
* const o
) const override
;
392 void accept(Visitor
*v
) override
{ v
->visit(this); }
395 class ArrayLiteralExp final
: public Expression
401 Expressions
*elements
;
403 static ArrayLiteralExp
*create(const Loc
&loc
, Expressions
*elements
);
404 ArrayLiteralExp
*syntaxCopy() override
;
405 bool equals(const RootObject
* const o
) const override
;
406 Expression
*getElement(d_size_t i
);
407 Optional
<bool> toBool() override
;
408 StringExp
*toStringExp() override
;
410 void accept(Visitor
*v
) override
{ v
->visit(this); }
413 class AssocArrayLiteralExp final
: public Expression
419 Expression
* lowering
;
421 bool equals(const RootObject
* const o
) const override
;
422 AssocArrayLiteralExp
*syntaxCopy() override
;
423 Optional
<bool> toBool() override
;
425 void accept(Visitor
*v
) override
{ v
->visit(this); }
428 class StructLiteralExp final
: public Expression
431 StructDeclaration
*sd
; // which aggregate this is for
432 Expressions
*elements
; // parallels sd->fields[] with NULL entries for fields to skip
433 Type
*stype
; // final type of result (can be different from sd's type)
437 Symbol
*sym
; // back end symbol to initialize with literal
439 // those fields need to prevent a infinite recursion when one field of struct initialized with 'this' pointer.
440 StructLiteralExp
*inlinecopy
;
443 /** pointer to the origin instance of the expression.
444 * once a new expression is created, origin is set to 'this'.
445 * anytime when an expression copy is created, 'origin' pointer is set to
446 * 'origin' pointer value of the original expression.
448 StructLiteralExp
*origin
;
451 /** anytime when recursive function is calling, 'stageflags' marks with bit flag of
452 * current stage and unmarks before return from this function.
453 * 'inlinecopy' uses similar 'stageflags' and from multiple evaluation 'doInline'
454 * (with infinite recursion) of this expression.
458 d_bool useStaticInit
; // if this is true, use the StructDeclaration's init symbol
459 d_bool isOriginal
; // used when moving instances to indicate `this is this.origin`
462 static StructLiteralExp
*create(const Loc
&loc
, StructDeclaration
*sd
, void *elements
, Type
*stype
= NULL
);
463 bool equals(const RootObject
* const o
) const override
;
464 StructLiteralExp
*syntaxCopy() override
;
466 void accept(Visitor
*v
) override
{ v
->visit(this); }
469 class TypeExp final
: public Expression
472 TypeExp
*syntaxCopy() override
;
473 bool checkType() override
;
474 bool checkValue() override
;
475 void accept(Visitor
*v
) override
{ v
->visit(this); }
478 class ScopeExp final
: public Expression
483 ScopeExp
*syntaxCopy() override
;
484 bool checkType() override
;
485 bool checkValue() override
;
486 void accept(Visitor
*v
) override
{ v
->visit(this); }
489 class TemplateExp final
: public Expression
492 TemplateDeclaration
*td
;
495 bool isLvalue() override
;
496 bool checkType() override
;
497 bool checkValue() override
;
498 void accept(Visitor
*v
) override
{ v
->visit(this); }
501 class NewExp final
: public Expression
504 /* newtype(arguments)
506 Expression
*thisexp
; // if !NULL, 'this' for class being allocated
508 Expressions
*arguments
; // Array of Expression's
509 Identifiers
*names
; // Array of names corresponding to expressions
511 Expression
*argprefix
; // expression to be evaluated just before arguments[]
513 CtorDeclaration
*member
; // constructor function
514 d_bool onstack
; // allocate on stack
515 d_bool thrownew
; // this NewExp is the expression of a ThrowStatement
517 Expression
*lowering
; // lowered druntime hook: `_d_newclass`
519 static NewExp
*create(const Loc
&loc
, Expression
*thisexp
, Type
*newtype
, Expressions
*arguments
);
520 NewExp
*syntaxCopy() override
;
522 void accept(Visitor
*v
) override
{ v
->visit(this); }
525 class NewAnonClassExp final
: public Expression
528 /* class baseclasses { } (arguments)
530 Expression
*thisexp
; // if !NULL, 'this' for class being allocated
531 ClassDeclaration
*cd
; // class being instantiated
532 Expressions
*arguments
; // Array of Expression's to call class constructor
534 NewAnonClassExp
*syntaxCopy() override
;
535 void accept(Visitor
*v
) override
{ v
->visit(this); }
538 class SymbolExp
: public Expression
542 Dsymbol
*originalScope
;
545 void accept(Visitor
*v
) override
{ v
->visit(this); }
548 // Offset from symbol
550 class SymOffExp final
: public SymbolExp
555 Optional
<bool> toBool() override
;
557 void accept(Visitor
*v
) override
{ v
->visit(this); }
562 class VarExp final
: public SymbolExp
565 d_bool delegateWasExtracted
;
566 static VarExp
*create(const Loc
&loc
, Declaration
*var
, bool hasOverloads
= true);
567 bool equals(const RootObject
* const o
) const override
;
568 bool isLvalue() override
;
570 void accept(Visitor
*v
) override
{ v
->visit(this); }
575 class OverExp final
: public Expression
580 bool isLvalue() override
;
581 void accept(Visitor
*v
) override
{ v
->visit(this); }
584 // Function/Delegate literal
586 class FuncExp final
: public Expression
589 FuncLiteralDeclaration
*fd
;
590 TemplateDeclaration
*td
;
593 bool equals(const RootObject
* const o
) const override
;
594 FuncExp
*syntaxCopy() override
;
595 const char *toChars() const override
;
596 bool checkType() override
;
597 bool checkValue() override
;
599 void accept(Visitor
*v
) override
{ v
->visit(this); }
602 // Declaration of a symbol
604 // D grammar allows declarations only as statements. However in AST representation
605 // it can be part of any expression. This is used, for example, during internal
606 // syntax re-writes to inject hidden symbols.
607 class DeclarationExp final
: public Expression
610 Dsymbol
*declaration
;
612 DeclarationExp
*syntaxCopy() override
;
614 bool hasCode() override
;
616 void accept(Visitor
*v
) override
{ v
->visit(this); }
619 class TypeidExp final
: public Expression
624 TypeidExp
*syntaxCopy() override
;
625 void accept(Visitor
*v
) override
{ v
->visit(this); }
628 class TraitsExp final
: public Expression
634 TraitsExp
*syntaxCopy() override
;
635 void accept(Visitor
*v
) override
{ v
->visit(this); }
638 class HaltExp final
: public Expression
641 void accept(Visitor
*v
) override
{ v
->visit(this); }
644 class IsExp final
: public Expression
647 /* is(targ id tok tspec)
648 * is(targ id == tok2)
651 Identifier
*id
; // can be NULL
652 Type
*tspec
; // can be NULL
653 TemplateParameters
*parameters
;
654 TOK tok
; // ':' or '=='
655 TOK tok2
; // 'struct', 'union', etc.
657 IsExp
*syntaxCopy() override
;
658 void accept(Visitor
*v
) override
{ v
->visit(this); }
661 /****************************************************************/
663 class UnaExp
: public Expression
668 UnaExp
*syntaxCopy() override
;
670 void accept(Visitor
*v
) override
{ v
->visit(this); }
673 class BinExp
: public Expression
679 Type
*att1
; // Save alias this type to detect recursion
680 Type
*att2
; // Save alias this type to detect recursion
682 BinExp
*syntaxCopy() override
;
684 void accept(Visitor
*v
) override
{ v
->visit(this); }
687 class BinAssignExp
: public BinExp
690 bool isLvalue() override final
;
691 void accept(Visitor
*v
) override
{ v
->visit(this); }
694 /****************************************************************/
696 class MixinExp final
: public UnaExp
699 void accept(Visitor
*v
) override
{ v
->visit(this); }
702 class ImportExp final
: public UnaExp
705 void accept(Visitor
*v
) override
{ v
->visit(this); }
708 class AssertExp final
: public UnaExp
713 AssertExp
*syntaxCopy() override
;
715 void accept(Visitor
*v
) override
{ v
->visit(this); }
718 class ThrowExp final
: public UnaExp
721 ThrowExp
*syntaxCopy() override
;
723 void accept(Visitor
*v
) override
{ v
->visit(this); }
726 class DotIdExp final
: public UnaExp
730 d_bool noderef
; // true if the result of the expression will never be dereferenced
731 d_bool wantsym
; // do not replace Symbol with its initializer during semantic()
732 d_bool arrow
; // ImportC: if -> instead of .
734 static DotIdExp
*create(const Loc
&loc
, Expression
*e
, Identifier
*ident
);
735 void accept(Visitor
*v
) override
{ v
->visit(this); }
738 class DotTemplateExp final
: public UnaExp
741 TemplateDeclaration
*td
;
743 bool checkType() override
;
744 bool checkValue() override
;
745 void accept(Visitor
*v
) override
{ v
->visit(this); }
748 class DotVarExp final
: public UnaExp
754 bool isLvalue() override
;
755 void accept(Visitor
*v
) override
{ v
->visit(this); }
758 class DotTemplateInstanceExp final
: public UnaExp
761 TemplateInstance
*ti
;
763 DotTemplateInstanceExp
*syntaxCopy() override
;
764 bool checkType() override
;
765 bool checkValue() override
;
766 void accept(Visitor
*v
) override
{ v
->visit(this); }
769 class DelegateExp final
: public UnaExp
772 FuncDeclaration
*func
;
774 VarDeclaration
*vthis2
; // container for multi-context
777 void accept(Visitor
*v
) override
{ v
->visit(this); }
780 class DotTypeExp final
: public UnaExp
783 Dsymbol
*sym
; // symbol that represents a type
785 void accept(Visitor
*v
) override
{ v
->visit(this); }
788 class CallExp final
: public UnaExp
791 Expressions
*arguments
; // function arguments
793 FuncDeclaration
*f
; // symbol to call
794 d_bool directcall
; // true if a virtual call is devirtualized
795 d_bool inDebugStatement
; // true if this was in a debug statement
796 d_bool ignoreAttributes
; // don't enforce attributes (e.g. call @gc function in @nogc code)
797 d_bool isUfcsRewrite
; // the first argument was pushed in here by a UFCS rewrite
798 VarDeclaration
*vthis2
; // container for multi-context
800 static CallExp
*create(const Loc
&loc
, Expression
*e
, Expressions
*exps
);
801 static CallExp
*create(const Loc
&loc
, Expression
*e
);
802 static CallExp
*create(const Loc
&loc
, Expression
*e
, Expression
*earg1
);
803 static CallExp
*create(const Loc
&loc
, FuncDeclaration
*fd
, Expression
*earg1
);
805 CallExp
*syntaxCopy() override
;
806 bool isLvalue() override
;
808 void accept(Visitor
*v
) override
{ v
->visit(this); }
811 class AddrExp final
: public UnaExp
814 void accept(Visitor
*v
) override
{ v
->visit(this); }
817 class PtrExp final
: public UnaExp
820 bool isLvalue() override
;
822 void accept(Visitor
*v
) override
{ v
->visit(this); }
825 class NegExp final
: public UnaExp
828 void accept(Visitor
*v
) override
{ v
->visit(this); }
831 class UAddExp final
: public UnaExp
834 void accept(Visitor
*v
) override
{ v
->visit(this); }
837 class ComExp final
: public UnaExp
840 void accept(Visitor
*v
) override
{ v
->visit(this); }
843 class NotExp final
: public UnaExp
846 void accept(Visitor
*v
) override
{ v
->visit(this); }
849 class DeleteExp final
: public UnaExp
853 void accept(Visitor
*v
) override
{ v
->visit(this); }
856 class CastExp final
: public UnaExp
859 // Possible to cast to one type while painting to another type
860 Type
*to
; // type to cast to
861 unsigned char mod
; // MODxxxxx
863 CastExp
*syntaxCopy() override
;
864 bool isLvalue() override
;
866 void accept(Visitor
*v
) override
{ v
->visit(this); }
869 class VectorExp final
: public UnaExp
872 TypeVector
*to
; // the target vector type before semantic()
873 unsigned dim
; // number of elements in the vector
876 static VectorExp
*create(const Loc
&loc
, Expression
*e
, Type
*t
);
877 VectorExp
*syntaxCopy() override
;
878 void accept(Visitor
*v
) override
{ v
->visit(this); }
881 class VectorArrayExp final
: public UnaExp
884 bool isLvalue() override
;
885 void accept(Visitor
*v
) override
{ v
->visit(this); }
888 class SliceExp final
: public UnaExp
891 Expression
*upr
; // NULL if implicit 0
892 Expression
*lwr
; // NULL if implicit [length - 1]
893 VarDeclaration
*lengthVar
;
895 bool upperIsInBounds() const; // true if upr <= e1.length
896 bool upperIsInBounds(bool v
);
897 bool lowerIsLessThanUpper() const; // true if lwr <= upr
898 bool lowerIsLessThanUpper(bool v
);
899 bool arrayop() const; // an array operation, rather than a slice
900 bool arrayop(bool v
);
905 SliceExp
*syntaxCopy() override
;
906 bool isLvalue() override
;
907 Optional
<bool> toBool() override
;
909 void accept(Visitor
*v
) override
{ v
->visit(this); }
912 class ArrayLengthExp final
: public UnaExp
915 void accept(Visitor
*v
) override
{ v
->visit(this); }
918 class IntervalExp final
: public Expression
924 IntervalExp
*syntaxCopy() override
;
925 void accept(Visitor
*v
) override
{ v
->visit(this); }
928 class DelegatePtrExp final
: public UnaExp
931 bool isLvalue() override
;
932 void accept(Visitor
*v
) override
{ v
->visit(this); }
935 class DelegateFuncptrExp final
: public UnaExp
938 bool isLvalue() override
;
939 void accept(Visitor
*v
) override
{ v
->visit(this); }
942 // e1[a0,a1,a2,a3,...]
944 class ArrayExp final
: public UnaExp
947 Expressions
*arguments
; // Array of Expression's
948 size_t currentDimension
; // for opDollar
949 VarDeclaration
*lengthVar
;
951 ArrayExp
*syntaxCopy() override
;
952 bool isLvalue() override
;
954 void accept(Visitor
*v
) override
{ v
->visit(this); }
957 /****************************************************************/
959 class DotExp final
: public BinExp
962 void accept(Visitor
*v
) override
{ v
->visit(this); }
965 class CommaExp final
: public BinExp
969 d_bool allowCommaExp
;
970 bool isLvalue() override
;
971 Optional
<bool> toBool() override
;
972 void accept(Visitor
*v
) override
{ v
->visit(this); }
975 class IndexExp final
: public BinExp
978 VarDeclaration
*lengthVar
;
980 d_bool indexIsInBounds
; // true if 0 <= e2 && e2 <= e1.length - 1
982 IndexExp
*syntaxCopy() override
;
983 bool isLvalue() override
;
985 void accept(Visitor
*v
) override
{ v
->visit(this); }
988 /* For both i++ and i--
990 class PostExp final
: public BinExp
993 void accept(Visitor
*v
) override
{ v
->visit(this); }
996 /* For both ++i and --i
998 class PreExp final
: public UnaExp
1001 void accept(Visitor
*v
) override
{ v
->visit(this); }
1004 enum class MemorySet
1006 none
= 0, // simple assignment
1007 blockAssign
= 1, // setting the contents of an array
1008 referenceInit
= 2 // setting the reference of STCref variable
1011 class AssignExp
: public BinExp
1016 bool isLvalue() override final
;
1018 void accept(Visitor
*v
) override
{ v
->visit(this); }
1021 class ConstructExp final
: public AssignExp
1024 void accept(Visitor
*v
) override
{ v
->visit(this); }
1027 class LoweredAssignExp final
: public AssignExp
1030 Expression
*lowering
;
1032 const char *toChars() const override
;
1033 void accept(Visitor
*v
) override
{ v
->visit(this); }
1036 class BlitExp final
: public AssignExp
1039 void accept(Visitor
*v
) override
{ v
->visit(this); }
1042 class AddAssignExp final
: public BinAssignExp
1045 void accept(Visitor
*v
) override
{ v
->visit(this); }
1048 class MinAssignExp final
: public BinAssignExp
1051 void accept(Visitor
*v
) override
{ v
->visit(this); }
1054 class MulAssignExp final
: public BinAssignExp
1057 void accept(Visitor
*v
) override
{ v
->visit(this); }
1060 class DivAssignExp final
: public BinAssignExp
1063 void accept(Visitor
*v
) override
{ v
->visit(this); }
1066 class ModAssignExp final
: public BinAssignExp
1069 void accept(Visitor
*v
) override
{ v
->visit(this); }
1072 class AndAssignExp final
: public BinAssignExp
1075 void accept(Visitor
*v
) override
{ v
->visit(this); }
1078 class OrAssignExp final
: public BinAssignExp
1081 void accept(Visitor
*v
) override
{ v
->visit(this); }
1084 class XorAssignExp final
: public BinAssignExp
1087 void accept(Visitor
*v
) override
{ v
->visit(this); }
1090 class PowAssignExp final
: public BinAssignExp
1093 void accept(Visitor
*v
) override
{ v
->visit(this); }
1096 class ShlAssignExp final
: public BinAssignExp
1099 void accept(Visitor
*v
) override
{ v
->visit(this); }
1102 class ShrAssignExp final
: public BinAssignExp
1105 void accept(Visitor
*v
) override
{ v
->visit(this); }
1108 class UshrAssignExp final
: public BinAssignExp
1111 void accept(Visitor
*v
) override
{ v
->visit(this); }
1114 class CatAssignExp
: public BinAssignExp
1117 Expression
*lowering
; // lowered druntime hook `_d_arrayappend{cTX,T}`
1119 void accept(Visitor
*v
) override
{ v
->visit(this); }
1122 class CatElemAssignExp final
: public CatAssignExp
1125 void accept(Visitor
*v
) override
{ v
->visit(this); }
1128 class CatDcharAssignExp final
: public CatAssignExp
1131 void accept(Visitor
*v
) override
{ v
->visit(this); }
1134 class AddExp final
: public BinExp
1137 void accept(Visitor
*v
) override
{ v
->visit(this); }
1140 class MinExp final
: public BinExp
1143 void accept(Visitor
*v
) override
{ v
->visit(this); }
1146 class CatExp final
: public BinExp
1149 Expression
*lowering
; // call to druntime hook `_d_arraycatnTX`
1151 void accept(Visitor
*v
) override
{ v
->visit(this); }
1154 class MulExp final
: public BinExp
1157 void accept(Visitor
*v
) override
{ v
->visit(this); }
1160 class DivExp final
: public BinExp
1163 void accept(Visitor
*v
) override
{ v
->visit(this); }
1166 class ModExp final
: public BinExp
1169 void accept(Visitor
*v
) override
{ v
->visit(this); }
1172 class PowExp final
: public BinExp
1175 void accept(Visitor
*v
) override
{ v
->visit(this); }
1178 class ShlExp final
: public BinExp
1181 void accept(Visitor
*v
) override
{ v
->visit(this); }
1184 class ShrExp final
: public BinExp
1187 void accept(Visitor
*v
) override
{ v
->visit(this); }
1190 class UshrExp final
: public BinExp
1193 void accept(Visitor
*v
) override
{ v
->visit(this); }
1196 class AndExp final
: public BinExp
1199 void accept(Visitor
*v
) override
{ v
->visit(this); }
1202 class OrExp final
: public BinExp
1205 void accept(Visitor
*v
) override
{ v
->visit(this); }
1208 class XorExp final
: public BinExp
1211 void accept(Visitor
*v
) override
{ v
->visit(this); }
1214 class LogicalExp final
: public BinExp
1217 void accept(Visitor
*v
) override
{ v
->visit(this); }
1220 class CmpExp final
: public BinExp
1223 void accept(Visitor
*v
) override
{ v
->visit(this); }
1226 class InExp final
: public BinExp
1229 void accept(Visitor
*v
) override
{ v
->visit(this); }
1232 class RemoveExp final
: public BinExp
1235 void accept(Visitor
*v
) override
{ v
->visit(this); }
1240 class EqualExp final
: public BinExp
1243 void accept(Visitor
*v
) override
{ v
->visit(this); }
1248 class IdentityExp final
: public BinExp
1251 void accept(Visitor
*v
) override
{ v
->visit(this); }
1254 /****************************************************************/
1256 class CondExp final
: public BinExp
1261 CondExp
*syntaxCopy() override
;
1262 bool isLvalue() override
;
1264 void accept(Visitor
*v
) override
{ v
->visit(this); }
1267 class GenericExp final
: Expression
1269 Expression
*cntlExp
;
1273 GenericExp
*syntaxCopy() override
;
1275 void accept(Visitor
*v
) override
{ v
->visit(this); }
1278 /****************************************************************/
1280 class DefaultInitExp
: public Expression
1283 void accept(Visitor
*v
) override
{ v
->visit(this); }
1286 class FileInitExp final
: public DefaultInitExp
1289 void accept(Visitor
*v
) override
{ v
->visit(this); }
1292 class LineInitExp final
: public DefaultInitExp
1295 void accept(Visitor
*v
) override
{ v
->visit(this); }
1298 class ModuleInitExp final
: public DefaultInitExp
1301 void accept(Visitor
*v
) override
{ v
->visit(this); }
1304 class FuncInitExp final
: public DefaultInitExp
1307 void accept(Visitor
*v
) override
{ v
->visit(this); }
1310 class PrettyFuncInitExp final
: public DefaultInitExp
1313 void accept(Visitor
*v
) override
{ v
->visit(this); }
1316 /****************************************************************/
1318 class ObjcClassReferenceExp final
: public Expression
1321 ClassDeclaration
* classDeclaration
;
1323 void accept(Visitor
*v
) override
{ v
->visit(this); }