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