2 /* Compiler implementation of the D programming language
3 * Copyright (C) 1999-2022 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
;
43 typedef union tree_node Symbol
;
45 struct Symbol
; // back end symbol
48 void expandTuples(Expressions
*exps
);
49 bool isTrivialExp(Expression
*e
);
50 bool hasSideEffect(Expression
*e
, bool assumeImpureCalls
= false);
53 BE
canThrow(Expression
*e
, FuncDeclaration
*func
, bool mustNotThrow
);
55 typedef unsigned char OwnedBy
;
58 OWNEDcode
, // normal code expression in AST
59 OWNEDctfe
, // value expression for CTFE
60 OWNEDcache
// constant value cached for CTFE
63 #define WANTvalue 0 // default
64 #define WANTexpand 1 // expand const/immutable variables if possible
67 * Specifies how the checkModify deals with certain situations
69 enum class ModifyFlags
71 /// Issue error messages on invalid modifications of the variable
73 /// No errors are emitted for invalid modifications
75 /// The modification occurs for a subfield of the current variable
79 class Expression
: public ASTNode
82 EXP op
; // to minimize use of dynamic_cast
83 unsigned char size
; // # of bytes in Expression so we can copy() it
84 unsigned char parens
; // if this is a parenthesized expression
85 Type
*type
; // !=NULL means that semantic() has been run
86 Loc loc
; // file location
90 virtual Expression
*syntaxCopy();
92 // kludge for template.isExpression()
93 DYNCAST
dyncast() const override final
{ return DYNCAST_EXPRESSION
; }
95 const char *toChars() const override
;
96 void error(const char *format
, ...) const;
97 void warning(const char *format
, ...) const;
98 void deprecation(const char *format
, ...) const;
100 virtual dinteger_t
toInteger();
101 virtual uinteger_t
toUInteger();
102 virtual real_t
toReal();
103 virtual real_t
toImaginary();
104 virtual complex_t
toComplex();
105 virtual StringExp
*toStringExp();
106 virtual bool isLvalue();
107 virtual Expression
*toLvalue(Scope
*sc
, Expression
*e
);
108 virtual Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
);
109 Expression
*implicitCastTo(Scope
*sc
, Type
*t
);
110 MATCH
implicitConvTo(Type
*t
);
111 Expression
*castTo(Scope
*sc
, Type
*t
);
112 virtual Expression
*resolveLoc(const Loc
&loc
, Scope
*sc
);
113 virtual bool checkType();
114 virtual bool checkValue();
115 bool checkDeprecated(Scope
*sc
, Dsymbol
*s
);
116 virtual Expression
*addDtorHook(Scope
*sc
);
117 Expression
*addressOf();
120 Expression
*optimize(int result
, bool keepLvalue
= false);
122 // Entry point for CTFE.
123 // A compile-time result is required. Give an error if not possible
124 Expression
*ctfeInterpret();
126 virtual Optional
<bool> toBool();
127 virtual bool hasCode()
132 IntegerExp
* isIntegerExp();
133 ErrorExp
* isErrorExp();
134 VoidInitExp
* isVoidInitExp();
135 RealExp
* isRealExp();
136 ComplexExp
* isComplexExp();
137 IdentifierExp
* isIdentifierExp();
138 DollarExp
* isDollarExp();
139 DsymbolExp
* isDsymbolExp();
140 ThisExp
* isThisExp();
141 SuperExp
* isSuperExp();
142 NullExp
* isNullExp();
143 StringExp
* isStringExp();
144 TupleExp
* isTupleExp();
145 ArrayLiteralExp
* isArrayLiteralExp();
146 AssocArrayLiteralExp
* isAssocArrayLiteralExp();
147 StructLiteralExp
* isStructLiteralExp();
148 TypeExp
* isTypeExp();
149 ScopeExp
* isScopeExp();
150 TemplateExp
* isTemplateExp();
152 NewAnonClassExp
* isNewAnonClassExp();
153 SymOffExp
* isSymOffExp();
155 OverExp
* isOverExp();
156 FuncExp
* isFuncExp();
157 DeclarationExp
* isDeclarationExp();
158 TypeidExp
* isTypeidExp();
159 TraitsExp
* isTraitsExp();
160 HaltExp
* isHaltExp();
162 MixinExp
* isMixinExp();
163 ImportExp
* isImportExp();
164 AssertExp
* isAssertExp();
165 DotIdExp
* isDotIdExp();
166 DotTemplateExp
* isDotTemplateExp();
167 DotVarExp
* isDotVarExp();
168 DotTemplateInstanceExp
* isDotTemplateInstanceExp();
169 DelegateExp
* isDelegateExp();
170 DotTypeExp
* isDotTypeExp();
171 CallExp
* isCallExp();
172 AddrExp
* isAddrExp();
175 UAddExp
* isUAddExp();
178 DeleteExp
* isDeleteExp();
179 CastExp
* isCastExp();
180 VectorExp
* isVectorExp();
181 VectorArrayExp
* isVectorArrayExp();
182 SliceExp
* isSliceExp();
183 ArrayLengthExp
* isArrayLengthExp();
184 ArrayExp
* isArrayExp();
186 CommaExp
* isCommaExp();
187 IntervalExp
* isIntervalExp();
188 DelegatePtrExp
* isDelegatePtrExp();
189 DelegateFuncptrExp
* isDelegateFuncptrExp();
190 IndexExp
* isIndexExp();
191 PostExp
* isPostExp();
193 AssignExp
* isAssignExp();
194 ConstructExp
* isConstructExp();
195 BlitExp
* isBlitExp();
196 AddAssignExp
* isAddAssignExp();
197 MinAssignExp
* isMinAssignExp();
198 MulAssignExp
* isMulAssignExp();
199 DivAssignExp
* isDivAssignExp();
200 ModAssignExp
* isModAssignExp();
201 AndAssignExp
* isAndAssignExp();
202 OrAssignExp
* isOrAssignExp();
203 XorAssignExp
* isXorAssignExp();
204 PowAssignExp
* isPowAssignExp();
205 ShlAssignExp
* isShlAssignExp();
206 ShrAssignExp
* isShrAssignExp();
207 UshrAssignExp
* isUshrAssignExp();
208 CatAssignExp
* isCatAssignExp();
209 CatElemAssignExp
* isCatElemAssignExp();
210 CatDcharAssignExp
* isCatDcharAssignExp();
220 UshrExp
* isUshrExp();
224 LogicalExp
* isLogicalExp();
226 RemoveExp
* isRemoveExp();
227 EqualExp
* isEqualExp();
228 IdentityExp
* isIdentityExp();
229 CondExp
* isCondExp();
230 GenericExp
* isGenericExp();
231 DefaultInitExp
* isDefaultInitExp();
232 FileInitExp
* isFileInitExp();
233 LineInitExp
* isLineInitExp();
234 ModuleInitExp
* isModuleInitExp();
235 FuncInitExp
* isFuncInitExp();
236 PrettyFuncInitExp
* isPrettyFuncInitExp();
237 ClassReferenceExp
* isClassReferenceExp();
238 ThrownExceptionExp
* isThrownExceptionExp();
241 BinAssignExp
* isBinAssignExp();
243 void accept(Visitor
*v
) override
{ v
->visit(this); }
246 class IntegerExp final
: public Expression
251 static IntegerExp
*create(const Loc
&loc
, dinteger_t value
, Type
*type
);
252 static void emplace(UnionExp
*pue
, const Loc
&loc
, dinteger_t value
, Type
*type
);
253 bool equals(const RootObject
*o
) const override
;
254 dinteger_t
toInteger() override
;
255 real_t
toReal() override
;
256 real_t
toImaginary() override
;
257 complex_t
toComplex() override
;
258 Optional
<bool> toBool() override
;
259 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
260 void accept(Visitor
*v
) override
{ v
->visit(this); }
261 dinteger_t
getInteger() { return value
; }
262 void setInteger(dinteger_t value
);
264 static IntegerExp
literal();
267 class ErrorExp final
: public Expression
270 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
271 void accept(Visitor
*v
) override
{ v
->visit(this); }
273 static ErrorExp
*errorexp
; // handy shared value
276 class RealExp final
: public Expression
281 static RealExp
*create(const Loc
&loc
, real_t value
, Type
*type
);
282 static void emplace(UnionExp
*pue
, const Loc
&loc
, real_t value
, Type
*type
);
283 bool equals(const RootObject
*o
) const override
;
284 dinteger_t
toInteger() override
;
285 uinteger_t
toUInteger() override
;
286 real_t
toReal() override
;
287 real_t
toImaginary() override
;
288 complex_t
toComplex() override
;
289 Optional
<bool> toBool() override
;
290 void accept(Visitor
*v
) override
{ v
->visit(this); }
293 class ComplexExp final
: public Expression
298 static ComplexExp
*create(const Loc
&loc
, complex_t value
, Type
*type
);
299 static void emplace(UnionExp
*pue
, const Loc
&loc
, complex_t value
, Type
*type
);
300 bool equals(const RootObject
*o
) const override
;
301 dinteger_t
toInteger() override
;
302 uinteger_t
toUInteger() override
;
303 real_t
toReal() override
;
304 real_t
toImaginary() override
;
305 complex_t
toComplex() override
;
306 Optional
<bool> toBool() override
;
307 void accept(Visitor
*v
) override
{ v
->visit(this); }
310 class IdentifierExp
: public Expression
315 static IdentifierExp
*create(const Loc
&loc
, Identifier
*ident
);
316 bool isLvalue() override final
;
317 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override final
;
318 void accept(Visitor
*v
) override
{ v
->visit(this); }
321 class DollarExp final
: public IdentifierExp
324 void accept(Visitor
*v
) override
{ v
->visit(this); }
327 class DsymbolExp final
: public Expression
333 DsymbolExp
*syntaxCopy() override
;
334 bool isLvalue() override
;
335 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
336 void accept(Visitor
*v
) override
{ v
->visit(this); }
339 class ThisExp
: public Expression
344 ThisExp
*syntaxCopy() override
;
345 Optional
<bool> toBool() override
;
346 bool isLvalue() override final
;
347 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override final
;
349 void accept(Visitor
*v
) override
{ v
->visit(this); }
352 class SuperExp final
: public ThisExp
355 void accept(Visitor
*v
) override
{ v
->visit(this); }
358 class NullExp final
: public Expression
361 bool equals(const RootObject
*o
) const override
;
362 Optional
<bool> toBool() override
;
363 StringExp
*toStringExp() override
;
364 void accept(Visitor
*v
) override
{ v
->visit(this); }
367 class StringExp final
: public Expression
370 void *string
; // char, wchar, or dchar data
371 size_t len
; // number of chars, wchars, or dchars
372 unsigned char sz
; // 1: char, 2: wchar, 4: dchar
373 unsigned char committed
; // !=0 if type is committed
374 utf8_t postfix
; // 'c', 'w', 'd'
377 static StringExp
*create(const Loc
&loc
, const char *s
);
378 static StringExp
*create(const Loc
&loc
, const void *s
, d_size_t len
);
379 static void emplace(UnionExp
*pue
, const Loc
&loc
, const char *s
);
380 bool equals(const RootObject
*o
) const override
;
381 char32_t
getCodeUnit(d_size_t i
) const;
382 void setCodeUnit(d_size_t i
, char32_t c
);
383 StringExp
*toStringExp() override
;
384 StringExp
*toUTF8(Scope
*sc
);
385 Optional
<bool> toBool() override
;
386 bool isLvalue() override
;
387 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
388 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
389 void accept(Visitor
*v
) override
{ v
->visit(this); }
390 size_t numberOfCodeUnits(int tynto
= 0) const;
391 void writeTo(void* dest
, bool zero
, int tyto
= 0) const;
396 class TupleExp final
: public Expression
399 Expression
*e0
; // side-effect part
400 /* Tuple-field access may need to take out its side effect part.
404 * (ref __tup = foo(); tuple(__tup.field0, __tup.field1, ...))
405 * The declaration of temporary variable __tup will be stored in TupleExp::e0.
409 static TupleExp
*create(const Loc
&loc
, Expressions
*exps
);
410 TupleExp
*syntaxCopy() override
;
411 bool equals(const RootObject
*o
) const override
;
413 void accept(Visitor
*v
) override
{ v
->visit(this); }
416 class ArrayLiteralExp final
: public Expression
420 Expressions
*elements
;
423 static ArrayLiteralExp
*create(const Loc
&loc
, Expressions
*elements
);
424 static void emplace(UnionExp
*pue
, const Loc
&loc
, Expressions
*elements
);
425 ArrayLiteralExp
*syntaxCopy() override
;
426 bool equals(const RootObject
*o
) const override
;
427 Expression
*getElement(d_size_t i
); // use opIndex instead
428 Expression
*opIndex(d_size_t i
);
429 Optional
<bool> toBool() override
;
430 StringExp
*toStringExp() override
;
432 void accept(Visitor
*v
) override
{ v
->visit(this); }
435 class AssocArrayLiteralExp final
: public Expression
442 bool equals(const RootObject
*o
) const override
;
443 AssocArrayLiteralExp
*syntaxCopy() override
;
444 Optional
<bool> toBool() override
;
446 void accept(Visitor
*v
) override
{ v
->visit(this); }
449 class StructLiteralExp final
: public Expression
452 StructDeclaration
*sd
; // which aggregate this is for
453 Expressions
*elements
; // parallels sd->fields[] with NULL entries for fields to skip
454 Type
*stype
; // final type of result (can be different from sd's type)
456 Symbol
*sym
; // back end symbol to initialize with literal
458 /** pointer to the origin instance of the expression.
459 * once a new expression is created, origin is set to 'this'.
460 * anytime when an expression copy is created, 'origin' pointer is set to
461 * 'origin' pointer value of the original expression.
463 StructLiteralExp
*origin
;
465 // those fields need to prevent a infinite recursion when one field of struct initialized with 'this' pointer.
466 StructLiteralExp
*inlinecopy
;
468 /** anytime when recursive function is calling, 'stageflags' marks with bit flag of
469 * current stage and unmarks before return from this function.
470 * 'inlinecopy' uses similar 'stageflags' and from multiple evaluation 'doInline'
471 * (with infinite recursion) of this expression.
475 bool useStaticInit
; // if this is true, use the StructDeclaration's init symbol
476 bool isOriginal
; // used when moving instances to indicate `this is this.origin`
479 static StructLiteralExp
*create(const Loc
&loc
, StructDeclaration
*sd
, void *elements
, Type
*stype
= NULL
);
480 bool equals(const RootObject
*o
) const override
;
481 StructLiteralExp
*syntaxCopy() override
;
482 Expression
*getField(Type
*type
, unsigned offset
);
483 int getFieldIndex(Type
*type
, unsigned offset
);
484 Expression
*addDtorHook(Scope
*sc
) override
;
485 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
487 void accept(Visitor
*v
) override
{ v
->visit(this); }
490 class TypeExp final
: public Expression
493 TypeExp
*syntaxCopy() override
;
494 bool checkType() override
;
495 bool checkValue() override
;
496 void accept(Visitor
*v
) override
{ v
->visit(this); }
499 class ScopeExp final
: public Expression
504 ScopeExp
*syntaxCopy() override
;
505 bool checkType() override
;
506 bool checkValue() override
;
507 void accept(Visitor
*v
) override
{ v
->visit(this); }
510 class TemplateExp final
: public Expression
513 TemplateDeclaration
*td
;
516 bool isLvalue() override
;
517 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
518 bool checkType() override
;
519 bool checkValue() override
;
520 void accept(Visitor
*v
) override
{ v
->visit(this); }
523 class NewExp final
: public Expression
526 /* newtype(arguments)
528 Expression
*thisexp
; // if !NULL, 'this' for class being allocated
530 Expressions
*arguments
; // Array of Expression's
532 Expression
*argprefix
; // expression to be evaluated just before arguments[]
534 CtorDeclaration
*member
; // constructor function
535 bool onstack
; // allocate on stack
536 bool thrownew
; // this NewExp is the expression of a ThrowStatement
538 static NewExp
*create(const Loc
&loc
, Expression
*thisexp
, Type
*newtype
, Expressions
*arguments
);
539 NewExp
*syntaxCopy() override
;
541 void accept(Visitor
*v
) override
{ v
->visit(this); }
544 class NewAnonClassExp final
: public Expression
547 /* class baseclasses { } (arguments)
549 Expression
*thisexp
; // if !NULL, 'this' for class being allocated
550 ClassDeclaration
*cd
; // class being instantiated
551 Expressions
*arguments
; // Array of Expression's to call class constructor
553 NewAnonClassExp
*syntaxCopy() override
;
554 void accept(Visitor
*v
) override
{ v
->visit(this); }
557 class SymbolExp
: public Expression
561 Dsymbol
*originalScope
;
564 void accept(Visitor
*v
) override
{ v
->visit(this); }
567 // Offset from symbol
569 class SymOffExp final
: public SymbolExp
574 Optional
<bool> toBool() override
;
576 void accept(Visitor
*v
) override
{ v
->visit(this); }
581 class VarExp final
: public SymbolExp
584 bool delegateWasExtracted
;
585 static VarExp
*create(const Loc
&loc
, Declaration
*var
, bool hasOverloads
= true);
586 bool equals(const RootObject
*o
) const override
;
587 bool isLvalue() override
;
588 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
589 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
591 void accept(Visitor
*v
) override
{ v
->visit(this); }
596 class OverExp final
: public Expression
601 bool isLvalue() override
;
602 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
603 void accept(Visitor
*v
) override
{ v
->visit(this); }
606 // Function/Delegate literal
608 class FuncExp final
: public Expression
611 FuncLiteralDeclaration
*fd
;
612 TemplateDeclaration
*td
;
615 bool equals(const RootObject
*o
) const override
;
616 FuncExp
*syntaxCopy() override
;
617 const char *toChars() const override
;
618 bool checkType() override
;
619 bool checkValue() override
;
621 void accept(Visitor
*v
) override
{ v
->visit(this); }
624 // Declaration of a symbol
626 // D grammar allows declarations only as statements. However in AST representation
627 // it can be part of any expression. This is used, for example, during internal
628 // syntax re-writes to inject hidden symbols.
629 class DeclarationExp final
: public Expression
632 Dsymbol
*declaration
;
634 DeclarationExp
*syntaxCopy() override
;
636 bool hasCode() override
;
638 void accept(Visitor
*v
) override
{ v
->visit(this); }
641 class TypeidExp final
: public Expression
646 TypeidExp
*syntaxCopy() override
;
647 void accept(Visitor
*v
) override
{ v
->visit(this); }
650 class TraitsExp final
: public Expression
656 TraitsExp
*syntaxCopy() override
;
657 void accept(Visitor
*v
) override
{ v
->visit(this); }
660 class HaltExp final
: public Expression
663 void accept(Visitor
*v
) override
{ v
->visit(this); }
666 class IsExp final
: public Expression
669 /* is(targ id tok tspec)
670 * is(targ id == tok2)
673 Identifier
*id
; // can be NULL
674 Type
*tspec
; // can be NULL
675 TemplateParameters
*parameters
;
676 TOK tok
; // ':' or '=='
677 TOK tok2
; // 'struct', 'union', etc.
679 IsExp
*syntaxCopy() override
;
680 void accept(Visitor
*v
) override
{ v
->visit(this); }
683 /****************************************************************/
685 class UnaExp
: public Expression
689 Type
*att1
; // Save alias this type to detect recursion
691 UnaExp
*syntaxCopy() override
;
692 Expression
*incompatibleTypes();
693 Expression
*resolveLoc(const Loc
&loc
, Scope
*sc
) override final
;
695 void accept(Visitor
*v
) override
{ v
->visit(this); }
698 class BinExp
: public Expression
704 Type
*att1
; // Save alias this type to detect recursion
705 Type
*att2
; // Save alias this type to detect recursion
707 BinExp
*syntaxCopy() override
;
708 Expression
*incompatibleTypes();
710 Expression
*reorderSettingAAElem(Scope
*sc
);
712 void accept(Visitor
*v
) override
{ v
->visit(this); }
715 class BinAssignExp
: public BinExp
718 bool isLvalue() override final
;
719 Expression
*toLvalue(Scope
*sc
, Expression
*ex
) override final
;
720 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override final
;
721 void accept(Visitor
*v
) override
{ v
->visit(this); }
724 /****************************************************************/
726 class MixinExp final
: public UnaExp
729 void accept(Visitor
*v
) override
{ v
->visit(this); }
732 class ImportExp final
: public UnaExp
735 void accept(Visitor
*v
) override
{ v
->visit(this); }
738 class AssertExp final
: public UnaExp
743 AssertExp
*syntaxCopy() override
;
745 void accept(Visitor
*v
) override
{ v
->visit(this); }
748 class ThrowExp final
: public UnaExp
751 ThrowExp
*syntaxCopy() override
;
753 void accept(Visitor
*v
) override
{ v
->visit(this); }
756 class DotIdExp final
: public UnaExp
760 bool noderef
; // true if the result of the expression will never be dereferenced
761 bool wantsym
; // do not replace Symbol with its initializer during semantic()
762 bool arrow
; // ImportC: if -> instead of .
764 static DotIdExp
*create(const Loc
&loc
, Expression
*e
, Identifier
*ident
);
765 void accept(Visitor
*v
) override
{ v
->visit(this); }
768 class DotTemplateExp final
: public UnaExp
771 TemplateDeclaration
*td
;
773 bool checkType() override
;
774 bool checkValue() override
;
775 void accept(Visitor
*v
) override
{ v
->visit(this); }
778 class DotVarExp final
: public UnaExp
784 bool isLvalue() override
;
785 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
786 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
787 void accept(Visitor
*v
) override
{ v
->visit(this); }
790 class DotTemplateInstanceExp final
: public UnaExp
793 TemplateInstance
*ti
;
795 DotTemplateInstanceExp
*syntaxCopy() override
;
796 bool findTempDecl(Scope
*sc
);
797 bool checkType() override
;
798 bool checkValue() override
;
799 void accept(Visitor
*v
) override
{ v
->visit(this); }
802 class DelegateExp final
: public UnaExp
805 FuncDeclaration
*func
;
807 VarDeclaration
*vthis2
; // container for multi-context
810 void accept(Visitor
*v
) override
{ v
->visit(this); }
813 class DotTypeExp final
: public UnaExp
816 Dsymbol
*sym
; // symbol that represents a type
818 void accept(Visitor
*v
) override
{ v
->visit(this); }
821 class CallExp final
: public UnaExp
824 Expressions
*arguments
; // function arguments
825 FuncDeclaration
*f
; // symbol to call
826 bool directcall
; // true if a virtual call is devirtualized
827 bool inDebugStatement
; // true if this was in a debug statement
828 bool ignoreAttributes
; // don't enforce attributes (e.g. call @gc function in @nogc code)
829 VarDeclaration
*vthis2
; // container for multi-context
831 static CallExp
*create(const Loc
&loc
, Expression
*e
, Expressions
*exps
);
832 static CallExp
*create(const Loc
&loc
, Expression
*e
);
833 static CallExp
*create(const Loc
&loc
, Expression
*e
, Expression
*earg1
);
834 static CallExp
*create(const Loc
&loc
, FuncDeclaration
*fd
, Expression
*earg1
);
836 CallExp
*syntaxCopy() override
;
837 bool isLvalue() override
;
838 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
839 Expression
*addDtorHook(Scope
*sc
) override
;
841 void accept(Visitor
*v
) override
{ v
->visit(this); }
844 class AddrExp final
: public UnaExp
847 void accept(Visitor
*v
) override
{ v
->visit(this); }
850 class PtrExp final
: public UnaExp
853 bool isLvalue() override
;
854 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
855 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
857 void accept(Visitor
*v
) override
{ v
->visit(this); }
860 class NegExp final
: public UnaExp
863 void accept(Visitor
*v
) override
{ v
->visit(this); }
866 class UAddExp final
: public UnaExp
869 void accept(Visitor
*v
) override
{ v
->visit(this); }
872 class ComExp final
: public UnaExp
875 void accept(Visitor
*v
) override
{ v
->visit(this); }
878 class NotExp final
: public UnaExp
881 void accept(Visitor
*v
) override
{ v
->visit(this); }
884 class DeleteExp final
: public UnaExp
888 void accept(Visitor
*v
) override
{ v
->visit(this); }
891 class CastExp final
: public UnaExp
894 // Possible to cast to one type while painting to another type
895 Type
*to
; // type to cast to
896 unsigned char mod
; // MODxxxxx
898 CastExp
*syntaxCopy() override
;
899 bool isLvalue() override
;
900 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
902 void accept(Visitor
*v
) override
{ v
->visit(this); }
905 class VectorExp final
: public UnaExp
908 TypeVector
*to
; // the target vector type before semantic()
909 unsigned dim
; // number of elements in the vector
912 static VectorExp
*create(const Loc
&loc
, Expression
*e
, Type
*t
);
913 static void emplace(UnionExp
*pue
, const Loc
&loc
, Expression
*e
, Type
*t
);
914 VectorExp
*syntaxCopy() override
;
915 void accept(Visitor
*v
) override
{ v
->visit(this); }
918 class VectorArrayExp final
: public UnaExp
921 bool isLvalue() override
;
922 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
923 void accept(Visitor
*v
) override
{ v
->visit(this); }
926 class SliceExp final
: public UnaExp
929 Expression
*upr
; // NULL if implicit 0
930 Expression
*lwr
; // NULL if implicit [length - 1]
931 VarDeclaration
*lengthVar
;
932 bool upperIsInBounds
; // true if upr <= e1.length
933 bool lowerIsLessThanUpper
; // true if lwr <= upr
934 bool arrayop
; // an array operation, rather than a slice
936 SliceExp
*syntaxCopy() override
;
937 bool isLvalue() override
;
938 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
939 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
940 Optional
<bool> toBool() override
;
942 void accept(Visitor
*v
) override
{ v
->visit(this); }
945 class ArrayLengthExp final
: public UnaExp
948 void accept(Visitor
*v
) override
{ v
->visit(this); }
951 class IntervalExp final
: public Expression
957 IntervalExp
*syntaxCopy() override
;
958 void accept(Visitor
*v
) override
{ v
->visit(this); }
961 class DelegatePtrExp final
: public UnaExp
964 bool isLvalue() override
;
965 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
966 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
967 void accept(Visitor
*v
) override
{ v
->visit(this); }
970 class DelegateFuncptrExp final
: public UnaExp
973 bool isLvalue() override
;
974 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
975 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
976 void accept(Visitor
*v
) override
{ v
->visit(this); }
979 // e1[a0,a1,a2,a3,...]
981 class ArrayExp final
: public UnaExp
984 Expressions
*arguments
; // Array of Expression's
985 size_t currentDimension
; // for opDollar
986 VarDeclaration
*lengthVar
;
988 ArrayExp
*syntaxCopy() override
;
989 bool isLvalue() override
;
990 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
992 void accept(Visitor
*v
) override
{ v
->visit(this); }
995 /****************************************************************/
997 class DotExp final
: public BinExp
1000 void accept(Visitor
*v
) override
{ v
->visit(this); }
1003 class CommaExp final
: public BinExp
1008 bool isLvalue() override
;
1009 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
1010 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
1011 Optional
<bool> toBool() override
;
1012 Expression
*addDtorHook(Scope
*sc
) override
;
1013 void accept(Visitor
*v
) override
{ v
->visit(this); }
1016 class IndexExp final
: public BinExp
1019 VarDeclaration
*lengthVar
;
1021 bool indexIsInBounds
; // true if 0 <= e2 && e2 <= e1.length - 1
1023 IndexExp
*syntaxCopy() override
;
1024 bool isLvalue() override
;
1025 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
1026 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
1028 void accept(Visitor
*v
) override
{ v
->visit(this); }
1031 /* For both i++ and i--
1033 class PostExp final
: public BinExp
1036 void accept(Visitor
*v
) override
{ v
->visit(this); }
1039 /* For both ++i and --i
1041 class PreExp final
: public UnaExp
1044 void accept(Visitor
*v
) override
{ v
->visit(this); }
1047 enum class MemorySet
1049 none
= 0, // simple assignment
1050 blockAssign
= 1, // setting the contents of an array
1051 referenceInit
= 2 // setting the reference of STCref variable
1054 class AssignExp
: public BinExp
1059 bool isLvalue() override final
;
1060 Expression
*toLvalue(Scope
*sc
, Expression
*ex
) override final
;
1062 void accept(Visitor
*v
) override
{ v
->visit(this); }
1065 class ConstructExp final
: public AssignExp
1068 void accept(Visitor
*v
) override
{ v
->visit(this); }
1071 class BlitExp final
: public AssignExp
1074 void accept(Visitor
*v
) override
{ v
->visit(this); }
1077 class AddAssignExp final
: public BinAssignExp
1080 void accept(Visitor
*v
) override
{ v
->visit(this); }
1083 class MinAssignExp final
: public BinAssignExp
1086 void accept(Visitor
*v
) override
{ v
->visit(this); }
1089 class MulAssignExp final
: public BinAssignExp
1092 void accept(Visitor
*v
) override
{ v
->visit(this); }
1095 class DivAssignExp final
: public BinAssignExp
1098 void accept(Visitor
*v
) override
{ v
->visit(this); }
1101 class ModAssignExp final
: public BinAssignExp
1104 void accept(Visitor
*v
) override
{ v
->visit(this); }
1107 class AndAssignExp final
: public BinAssignExp
1110 void accept(Visitor
*v
) override
{ v
->visit(this); }
1113 class OrAssignExp final
: public BinAssignExp
1116 void accept(Visitor
*v
) override
{ v
->visit(this); }
1119 class XorAssignExp final
: public BinAssignExp
1122 void accept(Visitor
*v
) override
{ v
->visit(this); }
1125 class PowAssignExp final
: public BinAssignExp
1128 void accept(Visitor
*v
) override
{ v
->visit(this); }
1131 class ShlAssignExp final
: public BinAssignExp
1134 void accept(Visitor
*v
) override
{ v
->visit(this); }
1137 class ShrAssignExp final
: public BinAssignExp
1140 void accept(Visitor
*v
) override
{ v
->visit(this); }
1143 class UshrAssignExp final
: public BinAssignExp
1146 void accept(Visitor
*v
) override
{ v
->visit(this); }
1149 class CatAssignExp
: public BinAssignExp
1152 void accept(Visitor
*v
) override
{ v
->visit(this); }
1155 class CatElemAssignExp final
: public CatAssignExp
1158 void accept(Visitor
*v
) override
{ v
->visit(this); }
1161 class CatDcharAssignExp final
: public CatAssignExp
1164 void accept(Visitor
*v
) override
{ v
->visit(this); }
1167 class AddExp final
: public BinExp
1170 void accept(Visitor
*v
) override
{ v
->visit(this); }
1173 class MinExp final
: public BinExp
1176 void accept(Visitor
*v
) override
{ v
->visit(this); }
1179 class CatExp final
: public BinExp
1182 void accept(Visitor
*v
) override
{ v
->visit(this); }
1185 class MulExp final
: public BinExp
1188 void accept(Visitor
*v
) override
{ v
->visit(this); }
1191 class DivExp final
: public BinExp
1194 void accept(Visitor
*v
) override
{ v
->visit(this); }
1197 class ModExp final
: public BinExp
1200 void accept(Visitor
*v
) override
{ v
->visit(this); }
1203 class PowExp final
: public BinExp
1206 void accept(Visitor
*v
) override
{ v
->visit(this); }
1209 class ShlExp final
: public BinExp
1212 void accept(Visitor
*v
) override
{ v
->visit(this); }
1215 class ShrExp final
: public BinExp
1218 void accept(Visitor
*v
) override
{ v
->visit(this); }
1221 class UshrExp final
: public BinExp
1224 void accept(Visitor
*v
) override
{ v
->visit(this); }
1227 class AndExp final
: public BinExp
1230 void accept(Visitor
*v
) override
{ v
->visit(this); }
1233 class OrExp final
: public BinExp
1236 void accept(Visitor
*v
) override
{ v
->visit(this); }
1239 class XorExp final
: public BinExp
1242 void accept(Visitor
*v
) override
{ v
->visit(this); }
1245 class LogicalExp final
: public BinExp
1248 void accept(Visitor
*v
) override
{ v
->visit(this); }
1251 class CmpExp final
: public BinExp
1254 void accept(Visitor
*v
) override
{ v
->visit(this); }
1257 class InExp final
: public BinExp
1260 void accept(Visitor
*v
) override
{ v
->visit(this); }
1263 class RemoveExp final
: public BinExp
1266 void accept(Visitor
*v
) override
{ v
->visit(this); }
1271 class EqualExp final
: public BinExp
1274 void accept(Visitor
*v
) override
{ v
->visit(this); }
1279 class IdentityExp final
: public BinExp
1282 void accept(Visitor
*v
) override
{ v
->visit(this); }
1285 /****************************************************************/
1287 class CondExp final
: public BinExp
1292 CondExp
*syntaxCopy() override
;
1293 bool isLvalue() override
;
1294 Expression
*toLvalue(Scope
*sc
, Expression
*e
) override
;
1295 Expression
*modifiableLvalue(Scope
*sc
, Expression
*e
) override
;
1296 void hookDtors(Scope
*sc
);
1298 void accept(Visitor
*v
) override
{ v
->visit(this); }
1301 class GenericExp final
: Expression
1303 Expression
*cntlExp
;
1307 GenericExp
*syntaxCopy() override
;
1309 void accept(Visitor
*v
) override
{ v
->visit(this); }
1312 /****************************************************************/
1314 class DefaultInitExp
: public Expression
1317 void accept(Visitor
*v
) override
{ v
->visit(this); }
1320 class FileInitExp final
: public DefaultInitExp
1323 Expression
*resolveLoc(const Loc
&loc
, Scope
*sc
) override
;
1324 void accept(Visitor
*v
) override
{ v
->visit(this); }
1327 class LineInitExp final
: public DefaultInitExp
1330 Expression
*resolveLoc(const Loc
&loc
, Scope
*sc
) override
;
1331 void accept(Visitor
*v
) override
{ v
->visit(this); }
1334 class ModuleInitExp final
: public DefaultInitExp
1337 Expression
*resolveLoc(const Loc
&loc
, Scope
*sc
) override
;
1338 void accept(Visitor
*v
) override
{ v
->visit(this); }
1341 class FuncInitExp final
: public DefaultInitExp
1344 Expression
*resolveLoc(const Loc
&loc
, Scope
*sc
) override
;
1345 void accept(Visitor
*v
) override
{ v
->visit(this); }
1348 class PrettyFuncInitExp final
: public DefaultInitExp
1351 Expression
*resolveLoc(const Loc
&loc
, Scope
*sc
) override
;
1352 void accept(Visitor
*v
) override
{ v
->visit(this); }
1355 /****************************************************************/
1357 /* A type meant as a union of all the Expression types,
1358 * to serve essentially as a Variant that will sit on the stack
1359 * during CTFE to reduce memory consumption.
1363 UnionExp() { } // yes, default constructor does nothing
1365 UnionExp(Expression
*e
)
1367 memcpy(this, (void *)e
, e
->size
);
1370 /* Extract pointer to Expression
1372 Expression
*exp() { return (Expression
*)&u
; }
1374 /* Convert to an allocated Expression
1379 // Ensure that the union is suitably aligned.
1380 #if defined(__GNUC__) || defined(__clang__)
1381 __attribute__((aligned(8)))
1382 #elif defined(_MSC_VER)
1383 __declspec(align(8))
1384 #elif defined(__DMC__)
1389 char exp
[sizeof(Expression
)];
1390 char integerexp
[sizeof(IntegerExp
)];
1391 char errorexp
[sizeof(ErrorExp
)];
1392 char realexp
[sizeof(RealExp
)];
1393 char complexexp
[sizeof(ComplexExp
)];
1394 char symoffexp
[sizeof(SymOffExp
)];
1395 char stringexp
[sizeof(StringExp
)];
1396 char arrayliteralexp
[sizeof(ArrayLiteralExp
)];
1397 char assocarrayliteralexp
[sizeof(AssocArrayLiteralExp
)];
1398 char structliteralexp
[sizeof(StructLiteralExp
)];
1399 char nullexp
[sizeof(NullExp
)];
1400 char dotvarexp
[sizeof(DotVarExp
)];
1401 char addrexp
[sizeof(AddrExp
)];
1402 char indexexp
[sizeof(IndexExp
)];
1403 char sliceexp
[sizeof(SliceExp
)];
1404 char vectorexp
[sizeof(VectorExp
)];
1406 #if defined(__DMC__)
1411 /****************************************************************/
1413 class ObjcClassReferenceExp final
: public Expression
1416 ClassDeclaration
* classDeclaration
;
1418 void accept(Visitor
*v
) override
{ v
->visit(this); }