source: src/Common/PassVisitor.impl.h @ 925b7f4

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since 925b7f4 was 925b7f4, checked in by Thierry Delisle <tdelisle@…>, 7 years ago

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

  • Property mode set to 100644
File size: 29.5 KB
RevLine 
[13932f14]1#pragma once
2
[6e09f211]3#define VISIT_START( node )                     \
4        __attribute__((unused))                   \
5        const auto & guard = init_guard();        \
6        call_previsit( node );                    \
7        if( visit_children() ) {                  \
8
9#define VISIT_END( node )                       \
10        }                                         \
[4551a6e]11        reset_visit();                            \
[6e09f211]12        call_postvisit( node );                   \
[9c1600c]13
[6e09f211]14#define MUTATE_START( node )                    \
15        __attribute__((unused))                   \
16        const auto & guard = init_guard();        \
17        call_premutate( node );                   \
18        if( visit_children() ) {                  \
[296b2be]19
20#define MUTATE_END( type, node )                \
[7b13aeb]21        }                                         \
[4551a6e]22        reset_visit();                            \
[296b2be]23        return call_postmutate< type * >( node ); \
24
25
[6e09f211]26#define VISIT_BODY( node )        \
27        VISIT_START( node );        \
28        Visitor::visit( node );     \
29        VISIT_END( node );          \
[13932f14]30
[ab904dc]31
[296b2be]32#define MUTATE_BODY( type, node ) \
33        MUTATE_START( node );       \
34        Mutator::mutate( node );    \
35        MUTATE_END( type, node );   \
36
[134322e]37
38
39template<typename T>
40static inline bool empty( T * ptr ) {
41        return !ptr || ptr->empty();
42}
43
44typedef std::list< Statement * > StmtList_t;
45
46template< typename pass_type >
47void PassVisitor< pass_type >::visitStatementList( std::list< Statement * > & statements ) {
48        SemanticError errors;
49
50        StmtList_t* beforeStmts = get_beforeStmts();
51        StmtList_t* afterStmts  = get_afterStmts();
52
53        for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
54                if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
55                try {
[9c1600c]56                        (*i)->accept( *this );
[134322e]57                } catch ( SemanticError &e ) {
58                        errors.append( e );
59                }
60                if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); }
61        }
62
63        if ( !empty( afterStmts ) ) { statements.splice( statements.end(), *afterStmts ); }
64        if ( !errors.isEmpty() ) { throw errors; }
65}
66
[296b2be]67template< typename pass_type >
68void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) {
69        SemanticError errors;
70
[134322e]71        StmtList_t* beforeStmts = get_beforeStmts();
72        StmtList_t* afterStmts  = get_afterStmts();
73
[296b2be]74        for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
[134322e]75                if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
[296b2be]76                try {
77                        *i = (*i)->acceptMutator( *this );
78                } catch ( SemanticError &e ) {
79                        errors.append( e );
[134322e]80                }
81                if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); }
[296b2be]82        }
[134322e]83
84        if ( !empty( afterStmts ) ) { statements.splice( statements.end(), *afterStmts ); }
85        if ( !errors.isEmpty() ) { throw errors; }
[296b2be]86}
87
88template< typename pass_type >
[134322e]89Statement * PassVisitor< pass_type >::visitStatement( Statement * stmt ) {
[296b2be]90        // don't want statements from outer CompoundStmts to be added to this CompoundStmt
[134322e]91        ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
92        ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
93        ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
[3fb9a83]94
[9c1600c]95        maybeAccept( stmt, *this );
[134322e]96
97        StmtList_t* beforeStmts = get_beforeStmts();
98        StmtList_t* afterStmts  = get_afterStmts();
99
[9c1600c]100        if( empty(beforeStmts) && empty(afterStmts) ) { return stmt; }
[134322e]101
102        CompoundStmt *compound = new CompoundStmt( noLabels );
103        if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
[9c1600c]104        compound->get_kids().push_back( stmt );
[134322e]105        if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
106        return compound;
107}
108
109template< typename pass_type >
110Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) {
111        // don't want statements from outer CompoundStmts to be added to this CompoundStmt
112        ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
113        ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
114        ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
[296b2be]115
116        Statement *newStmt = maybeMutate( stmt, *this );
[134322e]117
118        StmtList_t* beforeStmts = get_beforeStmts();
119        StmtList_t* afterStmts  = get_afterStmts();
120
121        if( empty(beforeStmts) && empty(afterStmts) ) { return newStmt; }
122
123        CompoundStmt *compound = new CompoundStmt( noLabels );
124        if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
125        compound->get_kids().push_back( newStmt );
126        if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
127        return compound;
128}
129
130
131
132template< typename pass_type >
133void PassVisitor< pass_type >::visitExpression( Expression * expr ) {
134        if( !expr ) return;
135
136        auto env_ptr = get_env_ptr();
137        if ( env_ptr && expr->get_env() ) {
138                *env_ptr = expr->get_env();
[296b2be]139        }
[134322e]140        // xxx - should env be cloned (or moved) onto the result of the mutate?
141        expr->accept( *this );
[296b2be]142}
143
144template< typename pass_type >
145Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) {
146        if( !expr ) return nullptr;
147
[134322e]148        auto env_ptr = get_env_ptr();
149        if ( env_ptr && expr->get_env() ) {
150                *env_ptr = expr->get_env();
[296b2be]151        }
152        // xxx - should env be cloned (or moved) onto the result of the mutate?
153        return expr->acceptMutator( *this );
154}
[ab904dc]155
156
[296b2be]157//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[13932f14]158
159template< typename pass_type >
[ab904dc]160void PassVisitor< pass_type >::visit( ObjectDecl * node ) {
[4551a6e]161        VISIT_BODY( node );
[13932f14]162}
163
164template< typename pass_type >
[ab904dc]165void PassVisitor< pass_type >::visit( FunctionDecl * node ) {
[4551a6e]166        VISIT_BODY( node );
[13932f14]167}
168
169template< typename pass_type >
[ab904dc]170void PassVisitor< pass_type >::visit( StructDecl * node ) {
[4551a6e]171        VISIT_BODY( node );
[13932f14]172}
173
174template< typename pass_type >
[ab904dc]175void PassVisitor< pass_type >::visit( UnionDecl * node ) {
[4551a6e]176        VISIT_BODY( node );
[13932f14]177}
178
179template< typename pass_type >
[ab904dc]180void PassVisitor< pass_type >::visit( EnumDecl * node ) {
[4551a6e]181        VISIT_BODY( node );
[13932f14]182}
183
184template< typename pass_type >
[ab904dc]185void PassVisitor< pass_type >::visit( TraitDecl * node ) {
[4551a6e]186        VISIT_BODY( node );
[13932f14]187}
188
189template< typename pass_type >
[ab904dc]190void PassVisitor< pass_type >::visit( TypeDecl * node ) {
[4551a6e]191        VISIT_BODY( node );
[13932f14]192}
193
194template< typename pass_type >
[ab904dc]195void PassVisitor< pass_type >::visit( TypedefDecl * node ) {
[4551a6e]196        VISIT_BODY( node );
[13932f14]197}
198
199template< typename pass_type >
[ab904dc]200void PassVisitor< pass_type >::visit( AsmDecl * node ) {
[4551a6e]201        VISIT_BODY( node );
[13932f14]202}
203
[9c1600c]204//--------------------------------------------------------------------------
205// CompoundStmt
[13932f14]206template< typename pass_type >
[ab904dc]207void PassVisitor< pass_type >::visit( CompoundStmt * node ) {
[9c1600c]208        VISIT_START( node );
209        call_beginScope();
210
211        visitStatementList( node->get_kids() );
212
213        call_endScope();
214        VISIT_END( node );
[13932f14]215}
216
[296b2be]217template< typename pass_type >
218CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) {
219        MUTATE_START( node );
220        call_beginScope();
221
222        mutateStatementList( node->get_kids() );
223
224        call_endScope();
225        MUTATE_END( CompoundStmt, node );
226}
227
[9c1600c]228//--------------------------------------------------------------------------
229// ExprStmt
[13932f14]230template< typename pass_type >
[ab904dc]231void PassVisitor< pass_type >::visit( ExprStmt * node ) {
[9c1600c]232        VISIT_START( node );
233        call_beginScope();
234
235        visitExpression( node->get_expr() );
236
237        call_endScope();
238        VISIT_END( node );
[13932f14]239}
240
[296b2be]241template< typename pass_type >
242Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) {
243        MUTATE_START( node );
244
245        node->set_expr( mutateExpression( node->get_expr() ) );
246
247        MUTATE_END( Statement, node );
248}
249
[13932f14]250template< typename pass_type >
[ab904dc]251void PassVisitor< pass_type >::visit( AsmStmt * node ) {
[4551a6e]252        VISIT_BODY( node );
[13932f14]253}
254
[9c1600c]255//--------------------------------------------------------------------------
256// IfStmt
[13932f14]257template< typename pass_type >
[ab904dc]258void PassVisitor< pass_type >::visit( IfStmt * node ) {
[4551a6e]259        VISIT_START( node );
[9c1600c]260
261        visitExpression( node->get_condition() );
262        node->set_thenPart ( visitStatement( node->get_thenPart() ) );
263        node->set_elsePart ( visitStatement( node->get_elsePart() ) );
264
265        VISIT_END( node );
[13932f14]266}
267
[296b2be]268template< typename pass_type >
269Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) {
[4551a6e]270        MUTATE_START( node );
[296b2be]271
272        node->set_condition( mutateExpression( node->get_condition() ) );
273        node->set_thenPart ( mutateStatement ( node->get_thenPart()  ) );
274        node->set_elsePart ( mutateStatement ( node->get_elsePart()  ) );
275
276        MUTATE_END( Statement, node );
277}
278
[9c1600c]279//--------------------------------------------------------------------------
280// WhileStmt
[13932f14]281template< typename pass_type >
[ab904dc]282void PassVisitor< pass_type >::visit( WhileStmt * node ) {
[4551a6e]283        VISIT_START( node );
[9c1600c]284
285        visitExpression( node->get_condition() );
286        node->set_body( visitStatement( node->get_body() ) );
287
288        VISIT_END( node );
[13932f14]289}
290
[296b2be]291template< typename pass_type >
292Statement * PassVisitor< pass_type >::mutate( WhileStmt * node ) {
[4551a6e]293        MUTATE_START( node );
[296b2be]294
295        node->set_condition( mutateExpression( node->get_condition() ) );
296        node->set_body( mutateStatement( node->get_body() ) );
297
298        MUTATE_END( Statement, node );
299}
300
[9c1600c]301//--------------------------------------------------------------------------
302// WhileStmt
[13932f14]303template< typename pass_type >
[ab904dc]304void PassVisitor< pass_type >::visit( ForStmt * node ) {
[4551a6e]305        VISIT_START( node );
[9c1600c]306
307        acceptAll( node->get_initialization(), *this );
308        visitExpression( node->get_condition() );
309        visitExpression( node->get_increment() );
310        node->set_body( visitStatement( node->get_body() ) );
311
312        VISIT_END( node );
[13932f14]313}
314
[296b2be]315template< typename pass_type >
316Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) {
[4551a6e]317        MUTATE_START( node );
[296b2be]318
319        mutateAll( node->get_initialization(), *this );
[9c1600c]320        node->set_condition( mutateExpression( node->get_condition() ) );
321        node->set_increment( mutateExpression( node->get_increment() ) );
322        node->set_body( mutateStatement( node->get_body() ) );
[296b2be]323
324        MUTATE_END( Statement, node );
325}
326
[9c1600c]327//--------------------------------------------------------------------------
328// SwitchStmt
[13932f14]329template< typename pass_type >
[ab904dc]330void PassVisitor< pass_type >::visit( SwitchStmt * node ) {
[4551a6e]331        VISIT_START( node );
[9c1600c]332
333        visitExpression( node->get_condition() );
334        visitStatementList( node->get_statements() );
335
336        VISIT_END( node );
[13932f14]337}
338
[296b2be]339template< typename pass_type >
340Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) {
[4551a6e]341        MUTATE_START( node );
342
[296b2be]343        node->set_condition( mutateExpression( node->get_condition() ) );
344        mutateStatementList( node->get_statements() );
[4551a6e]345
[296b2be]346        MUTATE_END( Statement, node );
347}
348
[9c1600c]349//--------------------------------------------------------------------------
[35df560]350// CaseStmt
[13932f14]351template< typename pass_type >
[ab904dc]352void PassVisitor< pass_type >::visit( CaseStmt * node ) {
[4551a6e]353        VISIT_START( node );
354
[9c1600c]355        visitExpression( node->get_condition() );
356        visitStatementList( node->get_statements() );
[4551a6e]357
[9c1600c]358        VISIT_END( node );
[13932f14]359}
360
[296b2be]361template< typename pass_type >
362Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) {
[4551a6e]363        MUTATE_START( node );
364
[296b2be]365        node->set_condition(  mutateExpression( node->get_condition() ) );
366        mutateStatementList( node->get_statements() );
[4551a6e]367
[296b2be]368        MUTATE_END( Statement, node );
369}
370
[13932f14]371template< typename pass_type >
[ab904dc]372void PassVisitor< pass_type >::visit( BranchStmt * node ) {
[4551a6e]373        VISIT_BODY( node );
[13932f14]374}
375
[9c1600c]376//--------------------------------------------------------------------------
377// ReturnStmt
[13932f14]378template< typename pass_type >
[ab904dc]379void PassVisitor< pass_type >::visit( ReturnStmt * node ) {
[9c1600c]380        VISIT_START( node );
381
382        visitExpression( node->get_expr() );
383
384        VISIT_END( node );
[13932f14]385}
386
[296b2be]387template< typename pass_type >
388Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) {
389        MUTATE_START( node );
390
391        node->set_expr( mutateExpression( node->get_expr() ) );
392
393        MUTATE_END( Statement, node );
394}
395
[6e09f211]396//--------------------------------------------------------------------------
397// ThrowStmt
398
399template< typename pass_type >
400void PassVisitor< pass_type >::visit( ThrowStmt * node ) {
401        VISIT_BODY( node );
402}
403
404template< typename pass_type >
405Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) {
406        MUTATE_BODY( Statement, node );
407}
408
[9c1600c]409//--------------------------------------------------------------------------
410// TryStmt
[13932f14]411template< typename pass_type >
[ab904dc]412void PassVisitor< pass_type >::visit( TryStmt * node ) {
[9c1600c]413        VISIT_START( node );
414
415        maybeAccept( node->get_block(), *this );
416        acceptAll( node->get_catchers(), *this );
417
418        VISIT_END( node );
[13932f14]419}
420
[296b2be]421template< typename pass_type >
422Statement * PassVisitor< pass_type >::mutate( TryStmt * node ) {
423        MUTATE_START( node );
424
425        node->set_block(  maybeMutate( node->get_block(), *this ) );
426        mutateAll( node->get_catchers(), *this );
[4551a6e]427
[296b2be]428        MUTATE_END( Statement, node );
429}
430
[9c1600c]431//--------------------------------------------------------------------------
432// CatchStmt
[13932f14]433template< typename pass_type >
[ab904dc]434void PassVisitor< pass_type >::visit( CatchStmt * node ) {
[9c1600c]435        VISIT_START( node );
436
437        node->set_body( visitStatement( node->get_body() ) );
438        maybeAccept( node->get_decl(), *this );
439
440        VISIT_END( node );
[13932f14]441}
442
[296b2be]443template< typename pass_type >
444Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) {
445        MUTATE_START( node );
[4551a6e]446
[296b2be]447        node->set_body(  mutateStatement( node->get_body() ) );
448        node->set_decl(  maybeMutate( node->get_decl(), *this ) );
[4551a6e]449
[296b2be]450        MUTATE_END( Statement, node );
451}
452
[13932f14]453template< typename pass_type >
[ab904dc]454void PassVisitor< pass_type >::visit( FinallyStmt * node ) {
[4551a6e]455        VISIT_BODY( node );
[13932f14]456}
457
458template< typename pass_type >
[ab904dc]459void PassVisitor< pass_type >::visit( NullStmt * node ) {
[4551a6e]460        VISIT_BODY( node );
[13932f14]461}
462
463template< typename pass_type >
[ab904dc]464void PassVisitor< pass_type >::visit( DeclStmt * node ) {
[4551a6e]465        VISIT_BODY( node );
[13932f14]466}
467
468template< typename pass_type >
[ab904dc]469void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) {
[4551a6e]470        VISIT_BODY( node );
[13932f14]471}
472
473template< typename pass_type >
[ab904dc]474void PassVisitor< pass_type >::visit( ApplicationExpr * node ) {
[4551a6e]475        VISIT_BODY( node );
[13932f14]476}
477
[9c1600c]478//--------------------------------------------------------------------------
479// UntypedExpr
[13932f14]480template< typename pass_type >
[ab904dc]481void PassVisitor< pass_type >::visit( UntypedExpr * node ) {
[9c1600c]482        VISIT_START( node );
483
484        for ( auto expr : node->get_args() ) {
485                visitExpression( expr );
486        }
487
488        VISIT_END( node );
[13932f14]489}
490
[296b2be]491template< typename pass_type >
492Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) {
493        MUTATE_START( node );
494
495        for ( auto& expr : node->get_args() ) {
496                expr = mutateExpression( expr );
497        }
498
499        MUTATE_END( Expression, node );
500}
501
[13932f14]502template< typename pass_type >
[ab904dc]503void PassVisitor< pass_type >::visit( NameExpr * node ) {
[4551a6e]504        VISIT_BODY( node );
[13932f14]505}
506
507template< typename pass_type >
[ab904dc]508void PassVisitor< pass_type >::visit( CastExpr * node ) {
[4551a6e]509        VISIT_BODY( node );
[13932f14]510}
511
512template< typename pass_type >
[ab904dc]513void PassVisitor< pass_type >::visit( AddressExpr * node ) {
[4551a6e]514        VISIT_BODY( node );
[13932f14]515}
516
517template< typename pass_type >
[ab904dc]518void PassVisitor< pass_type >::visit( LabelAddressExpr * node ) {
[4551a6e]519        VISIT_BODY( node );
[13932f14]520}
521
522template< typename pass_type >
[ab904dc]523void PassVisitor< pass_type >::visit( UntypedMemberExpr * node ) {
[4551a6e]524        VISIT_BODY( node );
[13932f14]525}
526
527template< typename pass_type >
[ab904dc]528void PassVisitor< pass_type >::visit( MemberExpr * node ) {
[4551a6e]529        VISIT_BODY( node );
[13932f14]530}
531
532template< typename pass_type >
[ab904dc]533void PassVisitor< pass_type >::visit( VariableExpr * node ) {
[4551a6e]534        VISIT_BODY( node );
[13932f14]535}
536
537template< typename pass_type >
[ab904dc]538void PassVisitor< pass_type >::visit( ConstantExpr * node ) {
[4551a6e]539        VISIT_BODY( node );
[13932f14]540}
541
542template< typename pass_type >
[ab904dc]543void PassVisitor< pass_type >::visit( SizeofExpr * node ) {
[4551a6e]544        VISIT_BODY( node );
[13932f14]545}
546
547template< typename pass_type >
[ab904dc]548void PassVisitor< pass_type >::visit( AlignofExpr * node ) {
[4551a6e]549        VISIT_BODY( node );
[13932f14]550}
551
552template< typename pass_type >
[ab904dc]553void PassVisitor< pass_type >::visit( UntypedOffsetofExpr * node ) {
[4551a6e]554        VISIT_BODY( node );
[13932f14]555}
556
557template< typename pass_type >
[ab904dc]558void PassVisitor< pass_type >::visit( OffsetofExpr * node ) {
[4551a6e]559        VISIT_BODY( node );
[13932f14]560}
561
562template< typename pass_type >
[ab904dc]563void PassVisitor< pass_type >::visit( OffsetPackExpr * node ) {
[4551a6e]564        VISIT_BODY( node );
[13932f14]565}
566
567template< typename pass_type >
[ab904dc]568void PassVisitor< pass_type >::visit( AttrExpr * node ) {
[4551a6e]569        VISIT_BODY( node );
[13932f14]570}
571
572template< typename pass_type >
[ab904dc]573void PassVisitor< pass_type >::visit( LogicalExpr * node ) {
[4551a6e]574        VISIT_BODY( node );
[13932f14]575}
576
577template< typename pass_type >
[ab904dc]578void PassVisitor< pass_type >::visit( ConditionalExpr * node ) {
[4551a6e]579        VISIT_BODY( node );
[13932f14]580}
581
582template< typename pass_type >
[ab904dc]583void PassVisitor< pass_type >::visit( CommaExpr * node ) {
[4551a6e]584        VISIT_BODY( node );
[13932f14]585}
586
587template< typename pass_type >
[ab904dc]588void PassVisitor< pass_type >::visit( TypeExpr * node ) {
[4551a6e]589        VISIT_BODY( node );
[13932f14]590}
591
592template< typename pass_type >
[ab904dc]593void PassVisitor< pass_type >::visit( AsmExpr * node ) {
[4551a6e]594        VISIT_BODY( node );
[13932f14]595}
596
597template< typename pass_type >
[ab904dc]598void PassVisitor< pass_type >::visit( ImplicitCopyCtorExpr * node ) {
[4551a6e]599        VISIT_BODY( node );
[13932f14]600}
601
602template< typename pass_type >
[ab904dc]603void PassVisitor< pass_type >::visit( ConstructorExpr * node ) {
[4551a6e]604        VISIT_BODY( node );
[13932f14]605}
606
607template< typename pass_type >
[ab904dc]608void PassVisitor< pass_type >::visit( CompoundLiteralExpr * node ) {
[af5c204a]609        VISIT_BODY( node );
[13932f14]610}
611
612template< typename pass_type >
[ab904dc]613void PassVisitor< pass_type >::visit( RangeExpr * node ) {
[4551a6e]614        VISIT_BODY( node );
[13932f14]615}
616
617template< typename pass_type >
[ab904dc]618void PassVisitor< pass_type >::visit( UntypedTupleExpr * node ) {
[4551a6e]619        VISIT_BODY( node );
[13932f14]620}
621
622template< typename pass_type >
[ab904dc]623void PassVisitor< pass_type >::visit( TupleExpr * node ) {
[4551a6e]624        VISIT_BODY( node );
[13932f14]625}
626
627template< typename pass_type >
[ab904dc]628void PassVisitor< pass_type >::visit( TupleIndexExpr * node ) {
[4551a6e]629        VISIT_BODY( node );
[13932f14]630}
631
632template< typename pass_type >
[ab904dc]633void PassVisitor< pass_type >::visit( TupleAssignExpr * node ) {
[4551a6e]634        VISIT_BODY( node );
[13932f14]635}
636
[9c1600c]637//--------------------------------------------------------------------------
638// UntypedExpr
[13932f14]639template< typename pass_type >
[ab904dc]640void PassVisitor< pass_type >::visit( StmtExpr * node ) {
[9c1600c]641        VISIT_START( node );
642
643        // don't want statements from outer CompoundStmts to be added to this StmtExpr
644        ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
645        ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
646        ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
647
648        Visitor::visit( node );
649
650        VISIT_END( node );
[13932f14]651}
652
[296b2be]653template< typename pass_type >
654Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) {
655        MUTATE_START( node );
[4551a6e]656
[296b2be]657        // don't want statements from outer CompoundStmts to be added to this StmtExpr
[134322e]658        ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
659        ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
660        ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
[296b2be]661
662        Mutator::mutate( node );
663
664        MUTATE_END( Expression, node );
665}
666
[13932f14]667template< typename pass_type >
[ab904dc]668void PassVisitor< pass_type >::visit( UniqueExpr * node ) {
[4551a6e]669        VISIT_BODY( node );
[13932f14]670}
671
672template< typename pass_type >
[ab904dc]673void PassVisitor< pass_type >::visit( VoidType * node ) {
[4551a6e]674        VISIT_BODY( node );
[13932f14]675}
676
677template< typename pass_type >
[ab904dc]678void PassVisitor< pass_type >::visit( BasicType * node ) {
[4551a6e]679        VISIT_BODY( node );
[13932f14]680}
681
682template< typename pass_type >
[ab904dc]683void PassVisitor< pass_type >::visit( PointerType * node ) {
[4551a6e]684        VISIT_BODY( node );
[13932f14]685}
686
687template< typename pass_type >
[ab904dc]688void PassVisitor< pass_type >::visit( ArrayType * node ) {
[4551a6e]689        VISIT_BODY( node );
[13932f14]690}
691
692template< typename pass_type >
[ab904dc]693void PassVisitor< pass_type >::visit( FunctionType * node ) {
[4551a6e]694        VISIT_BODY( node );
[13932f14]695}
696
697template< typename pass_type >
[ab904dc]698void PassVisitor< pass_type >::visit( StructInstType * node ) {
[4551a6e]699        VISIT_BODY( node );
[13932f14]700}
701
702template< typename pass_type >
[ab904dc]703void PassVisitor< pass_type >::visit( UnionInstType * node ) {
[4551a6e]704        VISIT_BODY( node );
[13932f14]705}
706
707template< typename pass_type >
[ab904dc]708void PassVisitor< pass_type >::visit( EnumInstType * node ) {
[4551a6e]709        VISIT_BODY( node );
[13932f14]710}
711
712template< typename pass_type >
[ab904dc]713void PassVisitor< pass_type >::visit( TraitInstType * node ) {
[4551a6e]714        VISIT_BODY( node );
[13932f14]715}
716
717template< typename pass_type >
[ab904dc]718void PassVisitor< pass_type >::visit( TypeInstType * node ) {
[4551a6e]719        VISIT_BODY( node );
[13932f14]720}
721
722template< typename pass_type >
[ab904dc]723void PassVisitor< pass_type >::visit( TupleType * node ) {
[4551a6e]724        VISIT_BODY( node );
[13932f14]725}
726
727template< typename pass_type >
[ab904dc]728void PassVisitor< pass_type >::visit( TypeofType * node ) {
[4551a6e]729        VISIT_BODY( node );
[13932f14]730}
731
732template< typename pass_type >
[ab904dc]733void PassVisitor< pass_type >::visit( AttrType * node ) {
[4551a6e]734        VISIT_BODY( node );
[13932f14]735}
736
737template< typename pass_type >
[ab904dc]738void PassVisitor< pass_type >::visit( VarArgsType * node ) {
[4551a6e]739        VISIT_BODY( node );
[13932f14]740}
741
742template< typename pass_type >
[ab904dc]743void PassVisitor< pass_type >::visit( ZeroType * node ) {
[4551a6e]744        VISIT_BODY( node );
[13932f14]745}
746
747template< typename pass_type >
[ab904dc]748void PassVisitor< pass_type >::visit( OneType * node ) {
[4551a6e]749        VISIT_BODY( node );
[13932f14]750}
751
[9c1600c]752//--------------------------------------------------------------------------
753// UntypedExpr
[13932f14]754template< typename pass_type >
[ab904dc]755void PassVisitor< pass_type >::visit( SingleInit * node ) {
[9c1600c]756        VISIT_START( node );
757
758        visitExpression( node->get_value() );
759
760        VISIT_END( node );
[13932f14]761}
762
[296b2be]763template< typename pass_type >
764Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) {
765        MUTATE_START( node );
766
767        node->set_value( mutateExpression( node->get_value() ) );
768
769        MUTATE_END( Initializer, node );
770}
771
[13932f14]772template< typename pass_type >
[ab904dc]773void PassVisitor< pass_type >::visit( ListInit * node ) {
[4551a6e]774        VISIT_BODY( node );
[13932f14]775}
776
777template< typename pass_type >
[ab904dc]778void PassVisitor< pass_type >::visit( ConstructorInit * node ) {
[4551a6e]779        VISIT_BODY( node );
[13932f14]780}
781
782template< typename pass_type >
[ab904dc]783void PassVisitor< pass_type >::visit( Subrange * node ) {
[4551a6e]784        VISIT_BODY( node );
[13932f14]785}
786
787template< typename pass_type >
[ab904dc]788void PassVisitor< pass_type >::visit( Constant * node ) {
[4551a6e]789        VISIT_BODY( node );
[13932f14]790}
[ab904dc]791
792//---------------------------------------------------------------------------------------------------------------
793
794template< typename pass_type >
795DeclarationWithType * PassVisitor< pass_type >::mutate( ObjectDecl * node ) {
796        MUTATE_BODY( DeclarationWithType, node );
797}
798
799template< typename pass_type >
800DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) {
801        MUTATE_BODY( DeclarationWithType, node );
802}
803
804template< typename pass_type >
805Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) {
806        MUTATE_BODY( Declaration, node );
807}
808
809template< typename pass_type >
810Declaration * PassVisitor< pass_type >::mutate( UnionDecl * node ) {
811        MUTATE_BODY( Declaration, node );
812}
813
814template< typename pass_type >
815Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) {
816        MUTATE_BODY( Declaration, node );
817}
818
819template< typename pass_type >
820Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) {
821        MUTATE_BODY( Declaration, node );
822}
823
824template< typename pass_type >
825TypeDecl * PassVisitor< pass_type >::mutate( TypeDecl * node ) {
826        MUTATE_BODY( TypeDecl, node );
827}
828
829template< typename pass_type >
830Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) {
831        MUTATE_BODY( Declaration, node );
832}
833
834template< typename pass_type >
835AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) {
836        MUTATE_BODY( AsmDecl, node );
837}
838
839template< typename pass_type >
840Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) {
841        MUTATE_BODY( Statement, node );
842}
843
844template< typename pass_type >
845Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) {
846        MUTATE_BODY( Statement, node );
847}
848
849template< typename pass_type >
850Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) {
851        MUTATE_BODY( Statement, node );
852}
853
854template< typename pass_type >
855NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) {
856        MUTATE_BODY( NullStmt, node );
857}
858
859template< typename pass_type >
860Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) {
861        MUTATE_BODY( Statement, node );
862}
863
864template< typename pass_type >
865Statement * PassVisitor< pass_type >::mutate( ImplicitCtorDtorStmt * node ) {
866        MUTATE_BODY( Statement, node );
867}
868
869template< typename pass_type >
870Expression * PassVisitor< pass_type >::mutate( ApplicationExpr * node ) {
871        MUTATE_BODY( Expression, node );
872}
873
874template< typename pass_type >
875Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) {
876        MUTATE_BODY( Expression, node );
877}
878
879template< typename pass_type >
880Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) {
881        MUTATE_BODY( Expression, node );
882}
883
884template< typename pass_type >
885Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) {
886        MUTATE_BODY( Expression, node );
887}
888
889template< typename pass_type >
890Expression * PassVisitor< pass_type >::mutate( CastExpr * node ) {
891        MUTATE_BODY( Expression, node );
892}
893
894template< typename pass_type >
895Expression * PassVisitor< pass_type >::mutate( UntypedMemberExpr * node ) {
896        MUTATE_BODY( Expression, node );
897}
898
899template< typename pass_type >
900Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) {
901        MUTATE_BODY( Expression, node );
902}
903
904template< typename pass_type >
905Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) {
906        MUTATE_BODY( Expression, node );
907}
908
909template< typename pass_type >
910Expression * PassVisitor< pass_type >::mutate( ConstantExpr * node ) {
911        MUTATE_BODY( Expression, node );
912}
913
914template< typename pass_type >
915Expression * PassVisitor< pass_type >::mutate( SizeofExpr * node ) {
916        MUTATE_BODY( Expression, node );
917}
918
919template< typename pass_type >
920Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) {
921        MUTATE_BODY( Expression, node );
922}
923
924template< typename pass_type >
925Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) {
926        MUTATE_BODY( Expression, node );
927}
928
929template< typename pass_type >
930Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) {
931        MUTATE_BODY( Expression, node );
932}
933
934template< typename pass_type >
935Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) {
936        MUTATE_BODY( Expression, node );
937}
938
939template< typename pass_type >
940Expression * PassVisitor< pass_type >::mutate( AttrExpr * node ) {
941        MUTATE_BODY( Expression, node );
942}
943
944template< typename pass_type >
945Expression * PassVisitor< pass_type >::mutate( LogicalExpr * node ) {
946        MUTATE_BODY( Expression, node );
947}
948
949template< typename pass_type >
950Expression * PassVisitor< pass_type >::mutate( ConditionalExpr * node ) {
951        MUTATE_BODY( Expression, node );
952}
953
954template< typename pass_type >
955Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) {
956        MUTATE_BODY( Expression, node );
957}
958
959template< typename pass_type >
960Expression * PassVisitor< pass_type >::mutate( TypeExpr * node ) {
961        MUTATE_BODY( Expression, node );
962}
963
964template< typename pass_type >
965Expression * PassVisitor< pass_type >::mutate( AsmExpr * node ) {
966        MUTATE_BODY( Expression, node );
967}
968
969template< typename pass_type >
970Expression * PassVisitor< pass_type >::mutate( ImplicitCopyCtorExpr * node ) {
971        MUTATE_BODY( Expression, node );
972}
973
974template< typename pass_type >
975Expression * PassVisitor< pass_type >::mutate( ConstructorExpr * node ) {
976        MUTATE_BODY( Expression, node );
977}
978
979template< typename pass_type >
980Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) {
981        MUTATE_BODY( Expression, node );
982}
983
984template< typename pass_type >
985Expression * PassVisitor< pass_type >::mutate( RangeExpr * node ) {
986        MUTATE_BODY( Expression, node );
987}
988
989template< typename pass_type >
990Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) {
991        MUTATE_BODY( Expression, node );
992}
993
994template< typename pass_type >
995Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) {
996        MUTATE_BODY( Expression, node );
997}
998
999template< typename pass_type >
1000Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) {
1001        MUTATE_BODY( Expression, node );
1002}
1003
1004template< typename pass_type >
1005Expression * PassVisitor< pass_type >::mutate( TupleAssignExpr * node ) {
1006        MUTATE_BODY( Expression, node );
1007}
1008
1009template< typename pass_type >
1010Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) {
1011        MUTATE_BODY( Expression, node );
1012}
1013
1014template< typename pass_type >
1015Type * PassVisitor< pass_type >::mutate( VoidType * node ) {
1016        MUTATE_BODY( Type, node );
1017}
1018
1019template< typename pass_type >
1020Type * PassVisitor< pass_type >::mutate( BasicType * node ) {
1021        MUTATE_BODY( Type, node );
1022}
1023
1024template< typename pass_type >
1025Type * PassVisitor< pass_type >::mutate( PointerType * node ) {
1026        MUTATE_BODY( Type, node );
1027}
1028
1029template< typename pass_type >
1030Type * PassVisitor< pass_type >::mutate( ArrayType * node ) {
1031        MUTATE_BODY( Type, node );
1032}
1033
1034template< typename pass_type >
1035Type * PassVisitor< pass_type >::mutate( FunctionType * node ) {
1036        MUTATE_BODY( Type, node );
1037}
1038
1039template< typename pass_type >
1040Type * PassVisitor< pass_type >::mutate( StructInstType * node ) {
1041        MUTATE_BODY( Type, node );
1042}
1043
1044template< typename pass_type >
1045Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) {
1046        MUTATE_BODY( Type, node );
1047}
1048
1049template< typename pass_type >
1050Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) {
1051        MUTATE_BODY( Type, node );
1052}
1053
1054template< typename pass_type >
1055Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) {
1056        MUTATE_BODY( Type, node );
1057}
1058
1059template< typename pass_type >
1060Type * PassVisitor< pass_type >::mutate( TypeInstType * node ) {
1061        MUTATE_BODY( Type, node );
1062}
1063
1064template< typename pass_type >
1065Type * PassVisitor< pass_type >::mutate( TupleType * node ) {
1066        MUTATE_BODY( Type, node );
1067}
1068
1069template< typename pass_type >
1070Type * PassVisitor< pass_type >::mutate( TypeofType * node ) {
1071        MUTATE_BODY( Type, node );
1072}
1073
1074template< typename pass_type >
1075Type * PassVisitor< pass_type >::mutate( AttrType * node ) {
1076        MUTATE_BODY( Type, node );
1077}
1078
1079template< typename pass_type >
1080Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) {
1081        MUTATE_BODY( Type, node );
1082}
1083
1084template< typename pass_type >
1085Type * PassVisitor< pass_type >::mutate( ZeroType * node ) {
1086        MUTATE_BODY( Type, node );
1087}
1088
1089template< typename pass_type >
1090Type * PassVisitor< pass_type >::mutate( OneType * node ) {
1091        MUTATE_BODY( Type, node );
1092}
1093
1094template< typename pass_type >
1095Initializer * PassVisitor< pass_type >::mutate( ListInit * node ) {
1096        MUTATE_BODY( Initializer, node );
1097}
1098
1099template< typename pass_type >
1100Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) {
1101        MUTATE_BODY( Initializer, node );
1102}
1103
1104template< typename pass_type >
1105Subrange * PassVisitor< pass_type >::mutate( Subrange * node  )  {
1106        MUTATE_BODY( Subrange, node );
1107}
1108
1109template< typename pass_type >
1110Constant * PassVisitor< pass_type >::mutate( Constant * node  )  {
1111        MUTATE_BODY( Constant, node );
[4551a6e]1112}
Note: See TracBrowser for help on using the repository browser.