source: src/Common/PassVisitor.impl.h@ 1a18423

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox 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 1a18423 was af5c204a, checked in by Rob Schluntz <rschlunt@…>, 8 years ago

remove UntypedValOfExpr and hook in build for StmtExpr

  • 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//--------------------------------------------------------------------------
350// SwitchStmt
[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.