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