source: src/SynTree/Expression.h@ 4ffdd63

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay gc_noraii jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since 4ffdd63 was 4ffdd63, checked in by Rob Schluntz <rschlunt@…>, 9 years ago

change FixCopyCtors to insert comma expressions and UntypedExpr assignments rather than changing the location of the argument. Remove copyCtors list from ImplicitCopyCtorExpr

  • Property mode set to 100644
File size: 24.2 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// Expression.h --
8//
9// Author : Richard C. Bilson
10// Created On : Mon May 18 07:44:20 2015
11// Last Modified By : Rob Schluntz
12// Last Modified On : Wed Apr 27 17:06:49 2016
13// Update Count : 21
14//
15
16#ifndef EXPRESSION_H
17#define EXPRESSION_H
18
19#include <map>
20#include "SynTree.h"
21#include "Visitor.h"
22#include "Mutator.h"
23#include "Constant.h"
24#include "Common/UniqueName.h"
25
26/// Expression is the root type for all expressions
27class Expression {
28 public:
29 Expression(Expression *_aname = 0 );
30 Expression( const Expression &other );
31 virtual ~Expression();
32
33 std::list<Type *>& get_results() { return results; }
34 void add_result( Type *t );
35
36 TypeSubstitution *get_env() const { return env; }
37 void set_env( TypeSubstitution *newValue ) { env = newValue; }
38 Expression *get_argName() const { return argName; }
39 void set_argName( Expression *name ) { argName = name; }
40
41 virtual Expression *clone() const = 0;
42 virtual void accept( Visitor &v ) = 0;
43 virtual Expression *acceptMutator( Mutator &m ) = 0;
44 virtual void print( std::ostream &os, int indent = 0 ) const;
45 protected:
46 std::list<Type *> results;
47 TypeSubstitution *env;
48 Expression* argName; // if expression is used as an argument, it can be "designated" by this name
49};
50
51/// ParamEntry contains the i.d. of a declaration and a type that is derived from that declaration,
52/// but subject to decay-to-pointer and type parameter renaming
53struct ParamEntry {
54 ParamEntry(): decl( 0 ), actualType( 0 ), formalType( 0 ), expr( 0 ) {}
55 ParamEntry( UniqueId decl, Type *actualType, Type *formalType, Expression* expr ): decl( decl ), actualType( actualType ), formalType( formalType ), expr( expr ) {}
56 ParamEntry( const ParamEntry &other );
57 ~ParamEntry();
58 ParamEntry &operator=( const ParamEntry &other );
59
60 UniqueId decl;
61 Type *actualType;
62 Type *formalType;
63 Expression* expr;
64};
65
66typedef std::map< UniqueId, ParamEntry > InferredParams;
67
68/// ApplicationExpr represents the application of a function to a set of parameters. This is the
69/// result of running an UntypedExpr through the expression analyzer.
70class ApplicationExpr : public Expression {
71 public:
72 ApplicationExpr( Expression *function );
73 ApplicationExpr( const ApplicationExpr &other );
74 virtual ~ApplicationExpr();
75
76 Expression *get_function() const { return function; }
77 void set_function( Expression *newValue ) { function = newValue; }
78 std::list<Expression *>& get_args() { return args; }
79 InferredParams &get_inferParams() { return inferParams; }
80
81 virtual ApplicationExpr *clone() const { return new ApplicationExpr( *this ); }
82 virtual void accept( Visitor &v ) { v.visit( this ); }
83 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
84 virtual void print( std::ostream &os, int indent = 0 ) const;
85 private:
86 Expression *function;
87 std::list<Expression *> args;
88 InferredParams inferParams;
89};
90
91/// UntypedExpr represents the application of a function to a set of parameters, but where the
92/// particular overload for the function name has not yet been determined. Most operators are
93/// converted into functional form automatically, to permit operator overloading.
94class UntypedExpr : public Expression {
95 public:
96 UntypedExpr( Expression *function, Expression *_aname = 0 );
97 UntypedExpr( const UntypedExpr &other );
98 UntypedExpr( Expression *function, std::list<Expression *> &args, Expression *_aname = 0 );
99 virtual ~UntypedExpr();
100
101 Expression *get_function() const { return function; }
102 void set_function( Expression *newValue ) { function = newValue; }
103
104 void set_args( std::list<Expression *> &listArgs ) { args = listArgs; }
105 std::list<Expression*>::iterator begin_args() { return args.begin(); }
106 std::list<Expression*>::iterator end_args() { return args.end(); }
107 std::list<Expression*>& get_args() { return args; }
108
109 virtual UntypedExpr *clone() const { return new UntypedExpr( *this ); }
110 virtual void accept( Visitor &v ) { v.visit( this ); }
111 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
112 virtual void print( std::ostream &os, int indent = 0 ) const;
113 virtual void printArgs(std::ostream &os, int indent = 0) const;
114 private:
115 Expression *function;
116 std::list<Expression*> args;
117};
118
119/// NameExpr contains a name whose meaning is still not determined
120class NameExpr : public Expression {
121 public:
122 NameExpr( std::string name, Expression *_aname = 0 );
123 NameExpr( const NameExpr &other );
124 virtual ~NameExpr();
125
126 const std::string &get_name() const { return name; }
127 void set_name( std::string newValue ) { name = newValue; }
128
129 virtual NameExpr *clone() const { return new NameExpr( *this ); }
130 virtual void accept( Visitor &v ) { v.visit( this ); }
131 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
132 virtual void print( std::ostream &os, int indent = 0 ) const;
133 private:
134 std::string name;
135};
136
137// The following classes are used to represent expression types that cannot be converted into
138// function-call format.
139
140/// AddressExpr represents a address-of expression, e.g. &e
141class AddressExpr : public Expression {
142 public:
143 AddressExpr( Expression *arg, Expression *_aname = 0 );
144 AddressExpr( const AddressExpr &other );
145 virtual ~AddressExpr();
146
147 Expression *get_arg() const { return arg; }
148 void set_arg(Expression *newValue ) { arg = newValue; }
149
150 virtual AddressExpr *clone() const { return new AddressExpr( *this ); }
151 virtual void accept( Visitor &v ) { v.visit( this ); }
152 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
153 virtual void print( std::ostream &os, int indent = 0 ) const;
154 private:
155 Expression *arg;
156};
157
158// xxx - this doesn't appear to actually be hooked in anywhere. We should use this instead of the "&&"" UntypedExpr hack
159class LabelAddressExpr : public Expression {
160 public:
161 LabelAddressExpr( Expression *arg );
162 LabelAddressExpr( const LabelAddressExpr &other );
163 virtual ~LabelAddressExpr();
164
165 Expression *get_arg() const { return arg; }
166 void set_arg(Expression *newValue ) { arg = newValue; }
167
168 virtual LabelAddressExpr *clone() const { return new LabelAddressExpr( *this ); }
169 virtual void accept( Visitor &v ) { v.visit( this ); }
170 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
171 virtual void print( std::ostream &os, int indent = 0 ) const;
172 private:
173 Expression *arg;
174};
175
176/// CastExpr represents a type cast expression, e.g. (int)e
177class CastExpr : public Expression {
178 public:
179 CastExpr( Expression *arg, Expression *_aname = 0 );
180 CastExpr( Expression *arg, Type *toType, Expression *_aname = 0 );
181 CastExpr( const CastExpr &other );
182 virtual ~CastExpr();
183
184 Expression *get_arg() const { return arg; }
185 void set_arg(Expression *newValue ) { arg = newValue; }
186
187 virtual CastExpr *clone() const { return new CastExpr( *this ); }
188 virtual void accept( Visitor &v ) { v.visit( this ); }
189 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
190 virtual void print( std::ostream &os, int indent = 0 ) const;
191 private:
192 Expression *arg;
193};
194
195/// UntypedMemberExpr represents a member selection operation, e.g. q.p before processing by the expression analyzer
196class UntypedMemberExpr : public Expression {
197 public:
198 UntypedMemberExpr( std::string member, Expression *aggregate, Expression *_aname = 0 );
199 UntypedMemberExpr( const UntypedMemberExpr &other );
200 virtual ~UntypedMemberExpr();
201
202 std::string get_member() const { return member; }
203 void set_member( const std::string &newValue ) { member = newValue; }
204 Expression *get_aggregate() const { return aggregate; }
205 void set_aggregate( Expression *newValue ) { aggregate = newValue; }
206
207 virtual UntypedMemberExpr *clone() const { return new UntypedMemberExpr( *this ); }
208 virtual void accept( Visitor &v ) { v.visit( this ); }
209 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
210 virtual void print( std::ostream &os, int indent = 0 ) const;
211 private:
212 std::string member;
213 Expression *aggregate;
214};
215
216/// MemberExpr represents a member selection operation, e.g. q.p after processing by the expression analyzer
217class MemberExpr : public Expression {
218 public:
219 MemberExpr( DeclarationWithType *member, Expression *aggregate, Expression *_aname = 0 );
220 MemberExpr( const MemberExpr &other );
221 virtual ~MemberExpr();
222
223 DeclarationWithType *get_member() const { return member; }
224 void set_member( DeclarationWithType *newValue ) { member = newValue; }
225 Expression *get_aggregate() const { return aggregate; }
226 void set_aggregate( Expression *newValue ) { aggregate = newValue; }
227
228 virtual MemberExpr *clone() const { return new MemberExpr( *this ); }
229 virtual void accept( Visitor &v ) { v.visit( this ); }
230 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
231 virtual void print( std::ostream &os, int indent = 0 ) const;
232 private:
233 DeclarationWithType *member;
234 Expression *aggregate;
235};
236
237/// VariableExpr represents an expression that simply refers to the value of a named variable
238class VariableExpr : public Expression {
239 public:
240 VariableExpr( DeclarationWithType *var, Expression *_aname = 0 );
241 VariableExpr( const VariableExpr &other );
242 virtual ~VariableExpr();
243
244 DeclarationWithType *get_var() const { return var; }
245 void set_var( DeclarationWithType *newValue ) { var = newValue; }
246
247 virtual VariableExpr *clone() const { return new VariableExpr( *this ); }
248 virtual void accept( Visitor &v ) { v.visit( this ); }
249 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
250 virtual void print( std::ostream &os, int indent = 0 ) const;
251 private:
252 DeclarationWithType *var;
253};
254
255/// ConstantExpr represents an expression that simply refers to the value of a constant
256class ConstantExpr : public Expression {
257 public:
258 ConstantExpr( Constant constant, Expression *_aname = 0 );
259 ConstantExpr( const ConstantExpr &other );
260 virtual ~ConstantExpr();
261
262 Constant *get_constant() { return &constant; }
263 void set_constant( const Constant &newValue ) { constant = newValue; }
264
265 virtual ConstantExpr *clone() const { return new ConstantExpr( *this ); }
266 virtual void accept( Visitor &v ) { v.visit( this ); }
267 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
268 virtual void print( std::ostream &os, int indent = 0 ) const;
269 private:
270 Constant constant;
271};
272
273/// SizeofExpr represents a sizeof expression (could be sizeof(int) or sizeof 3+4)
274class SizeofExpr : public Expression {
275 public:
276 SizeofExpr( Expression *expr, Expression *_aname = 0 );
277 SizeofExpr( const SizeofExpr &other );
278 SizeofExpr( Type *type, Expression *_aname = 0 );
279 virtual ~SizeofExpr();
280
281 Expression *get_expr() const { return expr; }
282 void set_expr( Expression *newValue ) { expr = newValue; }
283 Type *get_type() const { return type; }
284 void set_type( Type *newValue ) { type = newValue; }
285 bool get_isType() const { return isType; }
286 void set_isType( bool newValue ) { isType = newValue; }
287
288 virtual SizeofExpr *clone() const { return new SizeofExpr( *this ); }
289 virtual void accept( Visitor &v ) { v.visit( this ); }
290 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
291 virtual void print( std::ostream &os, int indent = 0 ) const;
292 private:
293 Expression *expr;
294 Type *type;
295 bool isType;
296};
297
298/// AlignofExpr represents an alignof expression
299class AlignofExpr : public Expression {
300 public:
301 AlignofExpr( Expression *expr, Expression *_aname = 0 );
302 AlignofExpr( const AlignofExpr &other );
303 AlignofExpr( Type *type, Expression *_aname = 0 );
304 virtual ~AlignofExpr();
305
306 Expression *get_expr() const { return expr; }
307 void set_expr( Expression *newValue ) { expr = newValue; }
308 Type *get_type() const { return type; }
309 void set_type( Type *newValue ) { type = newValue; }
310 bool get_isType() const { return isType; }
311 void set_isType( bool newValue ) { isType = newValue; }
312
313 virtual AlignofExpr *clone() const { return new AlignofExpr( *this ); }
314 virtual void accept( Visitor &v ) { v.visit( this ); }
315 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
316 virtual void print( std::ostream &os, int indent = 0 ) const;
317 private:
318 Expression *expr;
319 Type *type;
320 bool isType;
321};
322
323/// UntypedOffsetofExpr represents an offsetof expression before resolution
324class UntypedOffsetofExpr : public Expression {
325 public:
326 UntypedOffsetofExpr( Type *type, const std::string &member, Expression *_aname = 0 );
327 UntypedOffsetofExpr( const UntypedOffsetofExpr &other );
328 virtual ~UntypedOffsetofExpr();
329
330 std::string get_member() const { return member; }
331 void set_member( const std::string &newValue ) { member = newValue; }
332 Type *get_type() const { return type; }
333 void set_type( Type *newValue ) { type = newValue; }
334
335 virtual UntypedOffsetofExpr *clone() const { return new UntypedOffsetofExpr( *this ); }
336 virtual void accept( Visitor &v ) { v.visit( this ); }
337 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
338 virtual void print( std::ostream &os, int indent = 0 ) const;
339 private:
340 Type *type;
341 std::string member;
342};
343
344/// OffsetofExpr represents an offsetof expression
345class OffsetofExpr : public Expression {
346 public:
347 OffsetofExpr( Type *type, DeclarationWithType *member, Expression *_aname = 0 );
348 OffsetofExpr( const OffsetofExpr &other );
349 virtual ~OffsetofExpr();
350
351 Type *get_type() const { return type; }
352 void set_type( Type *newValue ) { type = newValue; }
353 DeclarationWithType *get_member() const { return member; }
354 void set_member( DeclarationWithType *newValue ) { member = newValue; }
355
356 virtual OffsetofExpr *clone() const { return new OffsetofExpr( *this ); }
357 virtual void accept( Visitor &v ) { v.visit( this ); }
358 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
359 virtual void print( std::ostream &os, int indent = 0 ) const;
360 private:
361 Type *type;
362 DeclarationWithType *member;
363};
364
365/// Expression representing a pack of field-offsets for a generic type
366class OffsetPackExpr : public Expression {
367public:
368 OffsetPackExpr( StructInstType *type_, Expression *aname_ = 0 );
369 OffsetPackExpr( const OffsetPackExpr &other );
370 virtual ~OffsetPackExpr();
371
372 StructInstType *get_type() const { return type; }
373 void set_type( StructInstType *newValue ) { type = newValue; }
374
375 virtual OffsetPackExpr *clone() const { return new OffsetPackExpr( *this ); }
376 virtual void accept( Visitor &v ) { v.visit( this ); }
377 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
378
379 virtual void print( std::ostream &os, int indent = 0 ) const;
380
381private:
382 StructInstType *type;
383};
384
385/// AttrExpr represents an @attribute expression (like sizeof, but user-defined)
386class AttrExpr : public Expression {
387 public:
388 AttrExpr(Expression *attr, Expression *expr, Expression *_aname = 0 );
389 AttrExpr( const AttrExpr &other );
390 AttrExpr( Expression *attr, Type *type, Expression *_aname = 0 );
391 virtual ~AttrExpr();
392
393 Expression *get_attr() const { return attr; }
394 void set_attr( Expression *newValue ) { attr = newValue; }
395 Expression *get_expr() const { return expr; }
396 void set_expr( Expression *newValue ) { expr = newValue; }
397 Type *get_type() const { return type; }
398 void set_type( Type *newValue ) { type = newValue; }
399 bool get_isType() const { return isType; }
400 void set_isType( bool newValue ) { isType = newValue; }
401
402 virtual AttrExpr *clone() const { return new AttrExpr( *this ); }
403 virtual void accept( Visitor &v ) { v.visit( this ); }
404 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
405 virtual void print( std::ostream &os, int indent = 0 ) const;
406 private:
407 Expression *attr;
408 Expression *expr;
409 Type *type;
410 bool isType;
411};
412
413/// LogicalExpr represents a short-circuit boolean expression (&& or ||)
414class LogicalExpr : public Expression {
415 public:
416 LogicalExpr( Expression *arg1, Expression *arg2, bool andp = true, Expression *_aname = 0 );
417 LogicalExpr( const LogicalExpr &other );
418 virtual ~LogicalExpr();
419
420 bool get_isAnd() const { return isAnd; }
421 Expression *get_arg1() { return arg1; }
422 void set_arg1( Expression *newValue ) { arg1 = newValue; }
423 Expression *get_arg2() const { return arg2; }
424 void set_arg2( Expression *newValue ) { arg2 = newValue; }
425
426 virtual LogicalExpr *clone() const { return new LogicalExpr( *this ); }
427 virtual void accept( Visitor &v ) { v.visit( this ); }
428 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
429 virtual void print( std::ostream &os, int indent = 0 ) const;
430 private:
431 Expression *arg1;
432 Expression *arg2;
433 bool isAnd;
434};
435
436/// ConditionalExpr represents the three-argument conditional ( p ? a : b )
437class ConditionalExpr : public Expression {
438 public:
439 ConditionalExpr( Expression *arg1, Expression *arg2, Expression *arg3, Expression *_aname = 0 );
440 ConditionalExpr( const ConditionalExpr &other );
441 virtual ~ConditionalExpr();
442
443 Expression *get_arg1() const { return arg1; }
444 void set_arg1( Expression *newValue ) { arg1 = newValue; }
445 Expression *get_arg2() const { return arg2; }
446 void set_arg2( Expression *newValue ) { arg2 = newValue; }
447 Expression *get_arg3() const { return arg3; }
448 void set_arg3( Expression *newValue ) { arg3 = newValue; }
449
450 virtual ConditionalExpr *clone() const { return new ConditionalExpr( *this ); }
451 virtual void accept( Visitor &v ) { v.visit( this ); }
452 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
453 virtual void print( std::ostream &os, int indent = 0 ) const;
454 private:
455 Expression *arg1;
456 Expression *arg2;
457 Expression *arg3;
458};
459
460/// CommaExpr represents the sequence operator ( a, b )
461class CommaExpr : public Expression {
462 public:
463 CommaExpr( Expression *arg1, Expression *arg2, Expression *_aname = 0 );
464 CommaExpr( const CommaExpr &other );
465 virtual ~CommaExpr();
466
467 Expression *get_arg1() const { return arg1; }
468 void set_arg1( Expression *newValue ) { arg1 = newValue; }
469 Expression *get_arg2() const { return arg2; }
470 void set_arg2( Expression *newValue ) { arg2 = newValue; }
471
472 virtual CommaExpr *clone() const { return new CommaExpr( *this ); }
473 virtual void accept( Visitor &v ) { v.visit( this ); }
474 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
475 virtual void print( std::ostream &os, int indent = 0 ) const;
476 private:
477 Expression *arg1;
478 Expression *arg2;
479};
480
481/// TupleExpr represents a tuple expression ( [a, b, c] )
482class TupleExpr : public Expression {
483 public:
484 TupleExpr( Expression *_aname = 0 );
485 TupleExpr( const TupleExpr &other );
486 virtual ~TupleExpr();
487
488 void set_exprs( std::list<Expression*> newValue ) { exprs = newValue; }
489 std::list<Expression*>& get_exprs() { return exprs; }
490
491 virtual TupleExpr *clone() const { return new TupleExpr( *this ); }
492 virtual void accept( Visitor &v ) { v.visit( this ); }
493 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
494 virtual void print( std::ostream &os, int indent = 0 ) const;
495 private:
496 std::list<Expression*> exprs;
497};
498
499/// SolvedTupleExpr represents a TupleExpr whose components have been type-resolved. It is effectively a shell for the code generator to work on
500class SolvedTupleExpr : public Expression {
501 public:
502 SolvedTupleExpr( Expression *_aname = 0 ) : Expression( _aname ) {}
503 SolvedTupleExpr( std::list<Expression *> &, Expression *_aname = 0 );
504 SolvedTupleExpr( const SolvedTupleExpr &other );
505 virtual ~SolvedTupleExpr() {}
506
507 std::list<Expression*> &get_exprs() { return exprs; }
508
509 virtual SolvedTupleExpr *clone() const { return new SolvedTupleExpr( *this ); }
510 virtual void accept( Visitor &v ) { v.visit( this ); }
511 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
512 virtual void print( std::ostream &os, int indent = 0 ) const;
513 private:
514 std::list<Expression*> exprs;
515};
516
517/// TypeExpr represents a type used in an expression (e.g. as a type generator parameter)
518class TypeExpr : public Expression {
519 public:
520 TypeExpr( Type *type );
521 TypeExpr( const TypeExpr &other );
522 virtual ~TypeExpr();
523
524 Type *get_type() const { return type; }
525 void set_type( Type *newValue ) { type = newValue; }
526
527 virtual TypeExpr *clone() const { return new TypeExpr( *this ); }
528 virtual void accept( Visitor &v ) { v.visit( this ); }
529 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
530 virtual void print( std::ostream &os, int indent = 0 ) const;
531 private:
532 Type *type;
533};
534
535/// AsmExpr represents a GCC 'asm constraint operand' used in an asm statement: [output] "=f" (result)
536class AsmExpr : public Expression {
537 public:
538 AsmExpr( Expression *inout, ConstantExpr *constraint, Expression *operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
539 AsmExpr( const AsmExpr & other );
540 virtual ~AsmExpr() { delete inout; delete constraint; delete operand; };
541
542 Expression *get_inout() const { return inout; }
543 void set_inout( Expression *newValue ) { inout = newValue; }
544
545 ConstantExpr *get_constraint() const { return constraint; }
546 void set_constraint( ConstantExpr *newValue ) { constraint = newValue; }
547
548 Expression *get_operand() const { return operand; }
549 void set_operand( Expression *newValue ) { operand = newValue; }
550
551 virtual AsmExpr *clone() const { return new AsmExpr( *this ); }
552 virtual void accept( Visitor &v ) { v.visit( this ); }
553 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
554 virtual void print( std::ostream &os, int indent = 0 ) const;
555 private:
556 // https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Machine-Constraints.html#Machine-Constraints
557 Expression *inout;
558 ConstantExpr *constraint;
559 Expression *operand;
560};
561
562/// ImplicitCopyCtorExpr represents the application of a function to a set of parameters,
563/// along with a set of copy constructor calls, one for each argument.
564class ImplicitCopyCtorExpr : public Expression {
565public:
566 ImplicitCopyCtorExpr( ApplicationExpr * callExpr );
567 ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other );
568 virtual ~ImplicitCopyCtorExpr();
569
570 ApplicationExpr *get_callExpr() const { return callExpr; }
571 void set_callExpr( ApplicationExpr *newValue ) { callExpr = newValue; }
572
573 std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; }
574 void set_tempDecls( std::list< ObjectDecl * > newValue ) { tempDecls = newValue; }
575
576 std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; }
577 void set_returnDecls( std::list< ObjectDecl * > newValue ) { returnDecls = newValue; }
578
579 std::list< Expression * > & get_dtors() { return dtors; }
580 void set_dtors( std::list< Expression * > newValue ) { dtors = newValue; }
581
582 virtual ImplicitCopyCtorExpr *clone() const { return new ImplicitCopyCtorExpr( *this ); }
583 virtual void accept( Visitor &v ) { v.visit( this ); }
584 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
585 virtual void print( std::ostream &os, int indent = 0 ) const;
586 private:
587 ApplicationExpr * callExpr;
588 std::list< ObjectDecl * > tempDecls;
589 std::list< ObjectDecl * > returnDecls;
590 std::list< Expression * > dtors;
591};
592
593/// ValofExpr represents a GCC 'lambda expression'
594class UntypedValofExpr : public Expression {
595 public:
596 UntypedValofExpr( Statement *_body, Expression *_aname = 0 ) : Expression( _aname ), body ( _body ) {}
597 UntypedValofExpr( const UntypedValofExpr & other );
598 virtual ~UntypedValofExpr();
599
600 Expression *get_value();
601 Statement *get_body() const { return body; }
602
603 virtual UntypedValofExpr *clone() const { return new UntypedValofExpr( *this ); }
604 virtual void accept( Visitor &v ) { v.visit( this ); }
605 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
606 virtual void print( std::ostream &os, int indent = 0 ) const;
607 private:
608 Statement *body;
609};
610
611/// CompoundLiteralExpr represents a C99 'compound literal'
612class CompoundLiteralExpr : public Expression {
613 public:
614 CompoundLiteralExpr( Type * type, Initializer * initializer );
615 CompoundLiteralExpr( const CompoundLiteralExpr &other );
616 ~CompoundLiteralExpr();
617
618 Type * get_type() const { return type; }
619 void set_type( Type * t ) { type = t; }
620
621 Initializer * get_initializer() const { return initializer; }
622 void set_initializer( Initializer * i ) { initializer = i; }
623
624 virtual CompoundLiteralExpr *clone() const { return new CompoundLiteralExpr( *this ); }
625 virtual void accept( Visitor &v ) { v.visit( this ); }
626 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
627 virtual void print( std::ostream &os, int indent = 0 ) const;
628 private:
629 Type * type;
630 Initializer * initializer;
631};
632
633std::ostream & operator<<( std::ostream & out, Expression * expr );
634
635#endif // EXPRESSION_H
636
637// Local Variables: //
638// tab-width: 4 //
639// mode: c++ //
640// compile-command: "make install" //
641// End: //
Note: See TracBrowser for help on using the repository browser.