source: src/Common/PassVisitor.impl.h@ c935c3a

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 c935c3a was 982832e, checked in by Thierry Delisle <tdelisle@…>, 8 years ago

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

  • Property mode set to 100644
File size: 56.1 KB
RevLine 
[13932f14]1#pragma once
[3268a58]2// IWYU pragma: private, include "PassVisitor.h"
[13932f14]3
[6e09f211]4#define VISIT_START( node ) \
5 __attribute__((unused)) \
[62423350]6 guard_value_impl guard( at_cleanup_impl(pass, 0) ); \
[b73bd70]7 bool visit_children = true; \
8 set_visit_children( visit_children ); \
[6e09f211]9 call_previsit( node ); \
[b73bd70]10 if( visit_children ) { \
[6e09f211]11
12#define VISIT_END( node ) \
13 } \
14 call_postvisit( node ); \
[9c1600c]15
[6e09f211]16#define MUTATE_START( node ) \
17 __attribute__((unused)) \
[62423350]18 guard_value_impl guard( at_cleanup_impl(pass, 0) ); \
[b73bd70]19 bool visit_children = true; \
20 set_visit_children( visit_children ); \
[6e09f211]21 call_premutate( node ); \
[b73bd70]22 if( visit_children ) { \
[296b2be]23
24#define MUTATE_END( type, node ) \
[7b13aeb]25 } \
[296b2be]26 return call_postmutate< type * >( node ); \
27
28
[6e09f211]29#define VISIT_BODY( node ) \
30 VISIT_START( node ); \
31 Visitor::visit( node ); \
32 VISIT_END( node ); \
[13932f14]33
[ab904dc]34
[296b2be]35#define MUTATE_BODY( type, node ) \
36 MUTATE_START( node ); \
37 Mutator::mutate( node ); \
38 MUTATE_END( type, node ); \
39
[134322e]40
41
42template<typename T>
43static inline bool empty( T * ptr ) {
44 return !ptr || ptr->empty();
45}
46
[6ca154b]47typedef std::list< Statement * > StmtList_t;
48typedef std::list< Declaration * > DeclList_t;
49
50template<typename iterator_t>
51static inline void splice( iterator_t it, DeclList_t * decls ) {
52 std::transform(
53 decls->begin(),
54 decls->end(),
55 it,
56 [](Declaration * decl) -> auto {
57 return new DeclStmt( noLabels, decl );
58 }
59 );
60 decls->clear();
61}
[134322e]62
63template< typename pass_type >
[6ca154b]64static inline void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& visitor ) {
[134322e]65
[6ca154b]66 DeclList_t* beforeDecls = visitor.get_beforeDecls();
67 DeclList_t* afterDecls = visitor.get_afterDecls();
[134322e]68
[6ca154b]69 for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
70 // splice in new declarations after previous decl
[d24d4e1]71 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); }
[6ca154b]72
73 if ( i == decls.end() ) break;
74
75 // run mutator on declaration
76 maybeAccept( *i, visitor );
77
78 // splice in new declarations before current decl
79 if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); }
[134322e]80 }
[6ca154b]81}
[134322e]82
[6ca154b]83template< typename pass_type >
84static inline void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& mutator ) {
85
86 DeclList_t* beforeDecls = mutator.get_beforeDecls();
87 DeclList_t* afterDecls = mutator.get_afterDecls();
88
89 for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
90 // splice in new declarations after previous decl
[d24d4e1]91 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); }
[6ca154b]92
93 if ( i == decls.end() ) break;
94
95 // run mutator on declaration
96 *i = maybeMutate( *i, mutator );
97
98 // splice in new declarations before current decl
99 if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); }
100 }
[134322e]101}
102
[e0886db]103template< typename Container, typename VisitorType >
104inline void maybeAccept( Container &container, VisitorType &visitor ) {
105 SemanticError errors;
106 for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) {
107 try {
108 if ( *i ) {
109 (*i)->accept( visitor );
110 }
111 } catch( SemanticError &e ) {
112 e.set_location( (*i)->location );
113 errors.append( e );
114 }
115 }
116 if ( ! errors.isEmpty() ) {
117 throw errors;
118 }
119}
120
121template< typename Container, typename MutatorType >
122inline void maybeMutateRef( Container &container, MutatorType &mutator ) {
123 SemanticError errors;
124 for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) {
125 try {
126 if ( *i ) {
127/// *i = (*i)->acceptMutator( mutator );
128 *i = dynamic_cast< typename Container::value_type >( (*i)->acceptMutator( mutator ) );
129 assert( *i );
130 } // if
131 } catch( SemanticError &e ) {
132 e.set_location( (*i)->location );
133 errors.append( e );
134 } // try
135 } // for
136 if ( ! errors.isEmpty() ) {
137 throw errors;
138 } // if
139}
140
[296b2be]141template< typename pass_type >
[6ca154b]142template< typename func_t >
143void PassVisitor< pass_type >::handleStatementList( std::list< Statement * > & statements, func_t func ) {
[296b2be]144 SemanticError errors;
145
[2a7b3ca]146 // don't want statements from outer CompoundStmts to be added to this CompoundStmt
147 ValueGuardPtr< StmtList_t > oldBeforeStmts( get_beforeStmts() );
148 ValueGuardPtr< StmtList_t > oldAfterStmts ( get_afterStmts () );
149 ValueGuardPtr< DeclList_t > oldBeforeDecls( get_beforeDecls() );
150 ValueGuardPtr< DeclList_t > oldAfterDecls ( get_afterDecls () );
151
[134322e]152 StmtList_t* beforeStmts = get_beforeStmts();
153 StmtList_t* afterStmts = get_afterStmts();
[6ca154b]154 DeclList_t* beforeDecls = get_beforeDecls();
155 DeclList_t* afterDecls = get_afterDecls();
[134322e]156
[296b2be]157 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
[6ca154b]158
159 if ( !empty( afterDecls ) ) { splice( std::inserter( statements, i ), afterDecls ); }
[134322e]160 if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
[6ca154b]161
[296b2be]162 try {
[6ca154b]163 func( *i );
164 assert(( empty( beforeStmts ) && empty( afterStmts ))
165 || ( empty( beforeDecls ) && empty( afterDecls )) );
166
[296b2be]167 } catch ( SemanticError &e ) {
168 errors.append( e );
[134322e]169 }
[6ca154b]170
171 if ( !empty( beforeDecls ) ) { splice( std::inserter( statements, i ), beforeDecls ); }
[134322e]172 if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); }
[296b2be]173 }
[134322e]174
[6ca154b]175 if ( !empty( afterDecls ) ) { splice( std::back_inserter( statements ), afterDecls); }
[134322e]176 if ( !empty( afterStmts ) ) { statements.splice( statements.end(), *afterStmts ); }
177 if ( !errors.isEmpty() ) { throw errors; }
[296b2be]178}
179
180template< typename pass_type >
[6ca154b]181void PassVisitor< pass_type >::visitStatementList( std::list< Statement * > & statements ) {
182 handleStatementList( statements, [this]( Statement * stmt) {
183 stmt->accept( *this );
184 });
185}
[134322e]186
[6ca154b]187template< typename pass_type >
188void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) {
189 handleStatementList( statements, [this]( Statement *& stmt) {
190 stmt = stmt->acceptMutator( *this );
191 });
[134322e]192}
193
[6ca154b]194
[134322e]195template< typename pass_type >
[6ca154b]196template< typename func_t >
197Statement * PassVisitor< pass_type >::handleStatement( Statement * stmt, func_t func ) {
[134322e]198 // don't want statements from outer CompoundStmts to be added to this CompoundStmt
[6ca154b]199 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr () );
200 ValueGuardPtr< DeclList_t > oldBeforeDecls( get_beforeDecls() );
201 ValueGuardPtr< DeclList_t > oldAfterDecls ( get_afterDecls () );
202 ValueGuardPtr< StmtList_t > oldBeforeStmts( get_beforeStmts() );
203 ValueGuardPtr< StmtList_t > oldAfterStmts ( get_afterStmts () );
[296b2be]204
[6ca154b]205 Statement *newStmt = func( stmt );
[134322e]206
207 StmtList_t* beforeStmts = get_beforeStmts();
208 StmtList_t* afterStmts = get_afterStmts();
[6ca154b]209 DeclList_t* beforeDecls = get_beforeDecls();
210 DeclList_t* afterDecls = get_afterDecls();
[134322e]211
[6ca154b]212 if( empty(beforeStmts) && empty(afterStmts) && empty(beforeDecls) && empty(afterDecls) ) { return newStmt; }
213 assert(( empty( beforeStmts ) && empty( afterStmts ))
214 || ( empty( beforeDecls ) && empty( afterDecls )) );
[134322e]215
216 CompoundStmt *compound = new CompoundStmt( noLabels );
[6ca154b]217 if( !empty(beforeDecls) ) { splice( std::back_inserter( compound->get_kids() ), beforeDecls ); }
[134322e]218 if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
219 compound->get_kids().push_back( newStmt );
[6ca154b]220 if( !empty(afterDecls) ) { splice( std::back_inserter( compound->get_kids() ), afterDecls ); }
[134322e]221 if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
222 return compound;
223}
224
225template< typename pass_type >
[6ca154b]226Statement * PassVisitor< pass_type >::visitStatement( Statement * stmt ) {
227 return handleStatement( stmt, [this]( Statement * stmt ) {
[d24d4e1]228 maybeAccept( stmt, *this );
[6ca154b]229 return stmt;
230 });
231}
[134322e]232
[6ca154b]233template< typename pass_type >
234Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) {
235 return handleStatement( stmt, [this]( Statement * stmt ) {
236 return maybeMutate( stmt, *this );
237 });
[296b2be]238}
239
240template< typename pass_type >
[6ca154b]241template< typename func_t >
242Expression * PassVisitor< pass_type >::handleExpression( Expression * expr, func_t func ) {
[296b2be]243 if( !expr ) return nullptr;
244
[134322e]245 auto env_ptr = get_env_ptr();
246 if ( env_ptr && expr->get_env() ) {
247 *env_ptr = expr->get_env();
[296b2be]248 }
[6ca154b]249
250 // should env be cloned (or moved) onto the result of the mutate?
251 return func( expr );
252}
253
254template< typename pass_type >
255Expression * PassVisitor< pass_type >::visitExpression( Expression * expr ) {
256 return handleExpression(expr, [this]( Expression * expr ) {
257 expr->accept( *this );
258 return expr;
[d24d4e1]259 });
[296b2be]260}
[ab904dc]261
[6ca154b]262template< typename pass_type >
263Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) {
264 return handleExpression(expr, [this]( Expression * expr ) {
265 return expr->acceptMutator( *this );
266 });
267}
[ab904dc]268
[296b2be]269//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[e0886db]270//========================================================================================================================================================================
271//========================================================================================================================================================================
272//========================================================================================================================================================================
273//========================================================================================================================================================================
274//========================================================================================================================================================================
275//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[13932f14]276
[e0886db]277
278//--------------------------------------------------------------------------
279// ObjectDecl
[13932f14]280template< typename pass_type >
[ab904dc]281void PassVisitor< pass_type >::visit( ObjectDecl * node ) {
[e0886db]282 VISIT_START( node );
283
284 indexerScopedAccept( node->type , *this );
285 maybeAccept ( node->init , *this );
286 maybeAccept ( node->bitfieldWidth, *this );
287
288 if ( node->name != "" ) {
289 indexerAddId( node );
290 }
291
292 VISIT_END( node );
293}
294
295template< typename pass_type >
296DeclarationWithType * PassVisitor< pass_type >::mutate( ObjectDecl * node ) {
297 MUTATE_START( node );
298
299 indexerScopedMutate( node->type , *this );
300 maybeMutateRef ( node->init , *this );
301 maybeMutateRef ( node->bitfieldWidth, *this );
302
303 if ( node->name != "" ) {
304 indexerAddId( node );
305 }
306
307 MUTATE_END( DeclarationWithType, node );
[13932f14]308}
309
[e0886db]310//--------------------------------------------------------------------------
311// FunctionDecl
[13932f14]312template< typename pass_type >
[ab904dc]313void PassVisitor< pass_type >::visit( FunctionDecl * node ) {
[e0886db]314 VISIT_START( node );
315
316 if ( node->name != "" ) {
317 indexerAddId( node );
318 }
319
320 {
321 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
322 maybeAccept( node->type, *this );
323 maybeAccept( node->statements, *this );
324 }
325
326 VISIT_END( node );
327}
328
329template< typename pass_type >
330DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) {
331 MUTATE_START( node );
332
333 if ( node->name != "" ) {
334 indexerAddId( node );
335 }
336
337 {
338 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
339 maybeMutateRef( node->type, *this );
340 maybeMutateRef( node->statements, *this );
341 }
342
343 MUTATE_END( DeclarationWithType, node );
[13932f14]344}
345
[e0886db]346//--------------------------------------------------------------------------
347// StructDecl
[13932f14]348template< typename pass_type >
[ab904dc]349void PassVisitor< pass_type >::visit( StructDecl * node ) {
[e0886db]350 VISIT_START( node );
351
352 // make up a forward declaration and add it before processing the members
353 // needs to be on the heap because addStruct saves the pointer
354 indexerAddStructFwd( node );
355
356 {
357 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
358 maybeAccept( node->parameters, *this );
359 maybeAccept( node->members , *this );
360 }
361
362 // this addition replaces the forward declaration
363 indexerAddStruct( node );
364
365 VISIT_END( node );
366}
367
368template< typename pass_type >
369Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) {
370 MUTATE_START( node );
371
372 // make up a forward declaration and add it before processing the members
373 // needs to be on the heap because addStruct saves the pointer
374 indexerAddStructFwd( node );
375
376 {
377 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
378 maybeMutateRef( node->parameters, *this );
379 maybeMutateRef( node->members , *this );
380 }
381
382 // this addition replaces the forward declaration
383 indexerAddStruct( node );
384
385 MUTATE_END( Declaration, node );
[13932f14]386}
387
[e0886db]388//--------------------------------------------------------------------------
389// UnionDecl
[13932f14]390template< typename pass_type >
[ab904dc]391void PassVisitor< pass_type >::visit( UnionDecl * node ) {
[e0886db]392 VISIT_START( node );
393
394 // make up a forward declaration and add it before processing the members
395 indexerAddUnionFwd( node );
396
397 {
398 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
399 maybeAccept( node->parameters, *this );
400 maybeAccept( node->members , *this );
401 }
402
403 indexerAddUnion( node );
404
405 VISIT_END( node );
406}
407
408template< typename pass_type >
409Declaration * PassVisitor< pass_type >::mutate( UnionDecl * node ) {
410 MUTATE_START( node );
411
412 // make up a forward declaration and add it before processing the members
413 indexerAddUnionFwd( node );
414
415 {
416 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
417 maybeMutateRef( node->parameters, *this );
418 maybeMutateRef( node->members , *this );
419 }
420
421 indexerAddUnion( node );
422
423 MUTATE_END( Declaration, node );
[13932f14]424}
425
[e0886db]426//--------------------------------------------------------------------------
427// EnumDecl
[13932f14]428template< typename pass_type >
[ab904dc]429void PassVisitor< pass_type >::visit( EnumDecl * node ) {
[e0886db]430 VISIT_START( node );
431
432 indexerAddEnum( node );
433
434 // unlike structs, contexts, and unions, enums inject their members into the global scope
435 maybeAccept( node->parameters, *this );
436 maybeAccept( node->members , *this );
437
438 VISIT_END( node );
[13932f14]439}
440
[e0886db]441template< typename pass_type >
442Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) {
443 MUTATE_START( node );
444
445 indexerAddEnum( node );
446
447 // unlike structs, contexts, and unions, enums inject their members into the global scope
448 maybeMutateRef( node->parameters, *this );
449 maybeMutateRef( node->members , *this );
450
451 MUTATE_END( Declaration, node );
452}
453
454//--------------------------------------------------------------------------
455// TraitDecl
[13932f14]456template< typename pass_type >
[ab904dc]457void PassVisitor< pass_type >::visit( TraitDecl * node ) {
[e0886db]458 VISIT_START( node );
459
460 {
461 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
462 maybeAccept( node->parameters, *this );
463 maybeAccept( node->members , *this );
464 }
465
466 indexerAddTrait( node );
467
468 VISIT_END( node );
[13932f14]469}
470
[e0886db]471template< typename pass_type >
472Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) {
473 MUTATE_START( node );
474
475 {
476 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
477 maybeMutateRef( node->parameters, *this );
478 maybeMutateRef( node->members , *this );
479 }
480
481 indexerAddTrait( node );
482
483 MUTATE_END( Declaration, node );
484}
485
486//--------------------------------------------------------------------------
487// TypeDecl
[13932f14]488template< typename pass_type >
[ab904dc]489void PassVisitor< pass_type >::visit( TypeDecl * node ) {
[e0886db]490 VISIT_START( node );
491
492 {
493 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
494 maybeAccept( node->parameters, *this );
495 maybeAccept( node->base , *this );
496 }
497
498 indexerAddType( node );
499
500 maybeAccept( node->assertions, *this );
501
502 indexerScopedAccept( node->init, *this );
503
504 VISIT_END( node );
505}
506
507template< typename pass_type >
[982832e]508Declaration * PassVisitor< pass_type >::mutate( TypeDecl * node ) {
[e0886db]509 MUTATE_START( node );
510
511 {
512 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
513 maybeMutateRef( node->parameters, *this );
514 maybeMutateRef( node->base , *this );
515 }
516
517 indexerAddType( node );
518
519 maybeMutateRef( node->assertions, *this );
520
521 indexerScopedMutate( node->init, *this );
522
[982832e]523 MUTATE_END( Declaration, node );
[13932f14]524}
525
[e0886db]526//--------------------------------------------------------------------------
527// TypedefDecl
[13932f14]528template< typename pass_type >
[ab904dc]529void PassVisitor< pass_type >::visit( TypedefDecl * node ) {
[e0886db]530 VISIT_START( node );
531
532 {
533 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
534 maybeAccept( node->parameters, *this );
535 maybeAccept( node->base , *this );
536 }
537
538 indexerAddType( node );
539
540 maybeAccept( node->assertions, *this );
541
542 VISIT_END( node );
[13932f14]543}
544
545template< typename pass_type >
[e0886db]546Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) {
547 MUTATE_START( node );
548
549 {
550 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
551 maybeMutateRef ( node->parameters, *this );
552 maybeMutateRef( node->base , *this );
553 }
554
555 indexerAddType( node );
556
557 maybeMutateRef( node->assertions, *this );
558
559 MUTATE_END( Declaration, node );
[13932f14]560}
561
[9c1600c]562//--------------------------------------------------------------------------
[e0886db]563// AsmDecl
[13932f14]564template< typename pass_type >
[e0886db]565void PassVisitor< pass_type >::visit( AsmDecl * node ) {
[9c1600c]566 VISIT_START( node );
567
[e0886db]568 maybeAccept( node->stmt, *this );
[9c1600c]569
570 VISIT_END( node );
[13932f14]571}
572
[296b2be]573template< typename pass_type >
[e0886db]574AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) {
[296b2be]575 MUTATE_START( node );
576
[e0886db]577 maybeMutateRef( node->stmt, *this );
578
579 MUTATE_END( AsmDecl, node );
580}
581
582//--------------------------------------------------------------------------
583// CompoundStmt
584template< typename pass_type >
585void PassVisitor< pass_type >::visit( CompoundStmt * node ) {
586 VISIT_START( node );
587 {
588 auto guard1 = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
589 auto guard2 = makeFuncGuard( [this]() { call_beginScope(); }, [this]() { call_endScope(); } );
590 visitStatementList( node->kids );
591 }
592 VISIT_END( node );
593}
[296b2be]594
[e0886db]595template< typename pass_type >
596CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) {
597 MUTATE_START( node );
598 {
599 auto guard1 = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
600 auto guard2 = makeFuncGuard( [this]() { call_beginScope(); }, [this]() { call_endScope(); } );
601 mutateStatementList( node->kids );
602 }
[296b2be]603 MUTATE_END( CompoundStmt, node );
604}
605
[9c1600c]606//--------------------------------------------------------------------------
607// ExprStmt
[13932f14]608template< typename pass_type >
[ab904dc]609void PassVisitor< pass_type >::visit( ExprStmt * node ) {
[9c1600c]610 VISIT_START( node );
611
[e0886db]612 visitExpression( node->expr );
[9c1600c]613
614 VISIT_END( node );
[13932f14]615}
616
[296b2be]617template< typename pass_type >
618Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) {
619 MUTATE_START( node );
620
[e0886db]621 node->expr = mutateExpression( node->expr );
[296b2be]622
623 MUTATE_END( Statement, node );
624}
625
[6ca154b]626//--------------------------------------------------------------------------
627// AsmStmt
[13932f14]628template< typename pass_type >
[ab904dc]629void PassVisitor< pass_type >::visit( AsmStmt * node ) {
[4551a6e]630 VISIT_BODY( node );
[13932f14]631}
632
[6ca154b]633template< typename pass_type >
634Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) {
635 MUTATE_BODY( Statement, node );
636}
637
[9c1600c]638//--------------------------------------------------------------------------
639// IfStmt
[13932f14]640template< typename pass_type >
[ab904dc]641void PassVisitor< pass_type >::visit( IfStmt * node ) {
[4551a6e]642 VISIT_START( node );
[9c1600c]643
[e0886db]644 visitExpression( node->condition );
645 node->thenPart = visitStatement( node->thenPart );
646 node->elsePart = visitStatement( node->elsePart );
[9c1600c]647
648 VISIT_END( node );
[13932f14]649}
650
[296b2be]651template< typename pass_type >
652Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) {
[4551a6e]653 MUTATE_START( node );
[e0886db]654 {
655 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
656 node->condition = mutateExpression( node->condition );
657 node->thenPart = mutateStatement ( node->thenPart );
658 node->elsePart = mutateStatement ( node->elsePart );
659 }
[296b2be]660 MUTATE_END( Statement, node );
661}
662
[9c1600c]663//--------------------------------------------------------------------------
664// WhileStmt
[13932f14]665template< typename pass_type >
[ab904dc]666void PassVisitor< pass_type >::visit( WhileStmt * node ) {
[4551a6e]667 VISIT_START( node );
[9c1600c]668
[e0886db]669 visitExpression( node->condition );
670 node->body = visitStatement( node->body );
[9c1600c]671
672 VISIT_END( node );
[13932f14]673}
674
[296b2be]675template< typename pass_type >
676Statement * PassVisitor< pass_type >::mutate( WhileStmt * node ) {
[4551a6e]677 MUTATE_START( node );
[296b2be]678
[e0886db]679 node->condition = mutateExpression( node->condition );
680 node->body = mutateStatement ( node->body );
[296b2be]681
682 MUTATE_END( Statement, node );
683}
684
[9c1600c]685//--------------------------------------------------------------------------
[6ca154b]686// ForStmt
[13932f14]687template< typename pass_type >
[ab904dc]688void PassVisitor< pass_type >::visit( ForStmt * node ) {
[4551a6e]689 VISIT_START( node );
[e0886db]690 {
691 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
692 maybeAccept( node->initialization, *this );
693 visitExpression( node->condition );
694 visitExpression( node->increment );
695 node->body = visitStatement( node->body );
696 }
[9c1600c]697 VISIT_END( node );
[13932f14]698}
699
[296b2be]700template< typename pass_type >
701Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) {
[4551a6e]702 MUTATE_START( node );
[e0886db]703 {
704 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
705 maybeMutateRef( node->initialization, *this );
706 node->condition = mutateExpression( node->condition );
707 node->increment = mutateExpression( node->increment );
708 node->body = mutateStatement ( node->body );
709 }
[296b2be]710 MUTATE_END( Statement, node );
711}
712
[9c1600c]713//--------------------------------------------------------------------------
714// SwitchStmt
[13932f14]715template< typename pass_type >
[ab904dc]716void PassVisitor< pass_type >::visit( SwitchStmt * node ) {
[4551a6e]717 VISIT_START( node );
[9c1600c]718
[e0886db]719 visitExpression ( node->condition );
720 visitStatementList( node->statements );
[9c1600c]721
722 VISIT_END( node );
[13932f14]723}
724
[296b2be]725template< typename pass_type >
726Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) {
[4551a6e]727 MUTATE_START( node );
728
[e0886db]729 node->condition = mutateExpression( node->condition );
730 mutateStatementList( node->statements );
[4551a6e]731
[296b2be]732 MUTATE_END( Statement, node );
733}
734
[9c1600c]735//--------------------------------------------------------------------------
[35df560]736// CaseStmt
[13932f14]737template< typename pass_type >
[ab904dc]738void PassVisitor< pass_type >::visit( CaseStmt * node ) {
[4551a6e]739 VISIT_START( node );
740
[e0886db]741 visitExpression ( node->condition );
742 visitStatementList( node->stmts );
[4551a6e]743
[9c1600c]744 VISIT_END( node );
[13932f14]745}
746
[296b2be]747template< typename pass_type >
748Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) {
[4551a6e]749 MUTATE_START( node );
750
[e0886db]751 node->condition = mutateExpression( node->condition );
752 mutateStatementList( node->stmts );
[4551a6e]753
[296b2be]754 MUTATE_END( Statement, node );
755}
756
[6ca154b]757//--------------------------------------------------------------------------
758// BranchStmt
[13932f14]759template< typename pass_type >
[ab904dc]760void PassVisitor< pass_type >::visit( BranchStmt * node ) {
[4551a6e]761 VISIT_BODY( node );
[13932f14]762}
763
[6ca154b]764template< typename pass_type >
765Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) {
766 MUTATE_BODY( Statement, node );
767}
768
[9c1600c]769//--------------------------------------------------------------------------
770// ReturnStmt
[13932f14]771template< typename pass_type >
[ab904dc]772void PassVisitor< pass_type >::visit( ReturnStmt * node ) {
[9c1600c]773 VISIT_START( node );
774
[e0886db]775 visitExpression( node->expr );
[9c1600c]776
777 VISIT_END( node );
[13932f14]778}
779
[296b2be]780template< typename pass_type >
781Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) {
782 MUTATE_START( node );
783
[e0886db]784 node->expr = mutateExpression( node->expr );
[296b2be]785
786 MUTATE_END( Statement, node );
787}
788
[6e09f211]789//--------------------------------------------------------------------------
790// ThrowStmt
791
792template< typename pass_type >
793void PassVisitor< pass_type >::visit( ThrowStmt * node ) {
794 VISIT_BODY( node );
795}
796
797template< typename pass_type >
798Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) {
799 MUTATE_BODY( Statement, node );
800}
801
[9c1600c]802//--------------------------------------------------------------------------
803// TryStmt
[13932f14]804template< typename pass_type >
[ab904dc]805void PassVisitor< pass_type >::visit( TryStmt * node ) {
[9c1600c]806 VISIT_START( node );
807
[e0886db]808 maybeAccept( node->block , *this );
[9dcb653]809 maybeAccept( node->handlers , *this );
[e0886db]810 maybeAccept( node->finallyBlock, *this );
[9c1600c]811
812 VISIT_END( node );
[13932f14]813}
814
[296b2be]815template< typename pass_type >
816Statement * PassVisitor< pass_type >::mutate( TryStmt * node ) {
817 MUTATE_START( node );
818
[e0886db]819 maybeMutateRef( node->block , *this );
[9dcb653]820 maybeMutateRef( node->handlers , *this );
[e0886db]821 maybeMutateRef( node->finallyBlock, *this );
[4551a6e]822
[296b2be]823 MUTATE_END( Statement, node );
824}
825
[9c1600c]826//--------------------------------------------------------------------------
827// CatchStmt
[13932f14]828template< typename pass_type >
[ab904dc]829void PassVisitor< pass_type >::visit( CatchStmt * node ) {
[9c1600c]830 VISIT_START( node );
[e0886db]831 {
832 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
833 maybeAccept( node->decl, *this );
834 node->cond = visitExpression( node->cond );
835 node->body = visitStatement ( node->body );
836 }
[9c1600c]837 VISIT_END( node );
[13932f14]838}
839
[296b2be]840template< typename pass_type >
841Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) {
842 MUTATE_START( node );
[e0886db]843 {
844 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
845 maybeMutateRef( node->decl, *this );
846 node->cond = mutateExpression( node->cond );
847 node->body = mutateStatement ( node->body );
848 }
[296b2be]849 MUTATE_END( Statement, node );
850}
851
[2065609]852//--------------------------------------------------------------------------
853// FinallyStmt
[13932f14]854template< typename pass_type >
[ab904dc]855void PassVisitor< pass_type >::visit( FinallyStmt * node ) {
[4551a6e]856 VISIT_BODY( node );
[13932f14]857}
858
[2065609]859template< typename pass_type >
860Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) {
861 MUTATE_BODY( Statement, node );
862}
863
864//--------------------------------------------------------------------------
865// WaitForStmt
866template< typename pass_type >
867void PassVisitor< pass_type >::visit( WaitForStmt * node ) {
868 VISIT_BODY( node );
869}
870
871template< typename pass_type >
872Statement * PassVisitor< pass_type >::mutate( WaitForStmt * node ) {
873 MUTATE_BODY( Statement, node );
874}
875
876//--------------------------------------------------------------------------
877// NullStmt
[13932f14]878template< typename pass_type >
[ab904dc]879void PassVisitor< pass_type >::visit( NullStmt * node ) {
[4551a6e]880 VISIT_BODY( node );
[13932f14]881}
882
[2065609]883template< typename pass_type >
884NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) {
885 MUTATE_BODY( NullStmt, node );
886}
887
888//--------------------------------------------------------------------------
889// DeclStmt
[13932f14]890template< typename pass_type >
[ab904dc]891void PassVisitor< pass_type >::visit( DeclStmt * node ) {
[4551a6e]892 VISIT_BODY( node );
[13932f14]893}
894
[2065609]895template< typename pass_type >
896Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) {
897 MUTATE_BODY( Statement, node );
898}
899
900//--------------------------------------------------------------------------
901// ImplicitCtorDtorStmt
[13932f14]902template< typename pass_type >
[ab904dc]903void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) {
[4551a6e]904 VISIT_BODY( node );
[13932f14]905}
906
[2065609]907template< typename pass_type >
908Statement * PassVisitor< pass_type >::mutate( ImplicitCtorDtorStmt * node ) {
909 MUTATE_BODY( Statement, node );
910}
911
912//--------------------------------------------------------------------------
913// ApplicationExpr
[13932f14]914template< typename pass_type >
[ab904dc]915void PassVisitor< pass_type >::visit( ApplicationExpr * node ) {
[e0886db]916 VISIT_START( node );
917
918 indexerScopedAccept( node->result , *this );
919 maybeAccept ( node->function, *this );
[9dcb653]920 maybeAccept ( node->args , *this );
[e0886db]921
922 VISIT_END( node );
[13932f14]923}
924
[2065609]925template< typename pass_type >
926Expression * PassVisitor< pass_type >::mutate( ApplicationExpr * node ) {
[e0886db]927 MUTATE_START( node );
928
929 indexerScopedMutate( node->env , *this );
930 indexerScopedMutate( node->result , *this );
931 maybeMutateRef ( node->function, *this );
[9dcb653]932 maybeMutateRef ( node->args , *this );
[e0886db]933
934 MUTATE_END( Expression, node );
[2065609]935}
936
[9c1600c]937//--------------------------------------------------------------------------
938// UntypedExpr
[13932f14]939template< typename pass_type >
[ab904dc]940void PassVisitor< pass_type >::visit( UntypedExpr * node ) {
[9c1600c]941 VISIT_START( node );
942
[2a7b3ca]943 // maybeAccept( node->get_env(), *this );
[e0886db]944 indexerScopedAccept( node->result, *this );
[2a7b3ca]945
[e0886db]946 for ( auto expr : node->args ) {
[9c1600c]947 visitExpression( expr );
948 }
949
950 VISIT_END( node );
[13932f14]951}
952
[296b2be]953template< typename pass_type >
954Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) {
955 MUTATE_START( node );
956
[e0886db]957 indexerScopedMutate( node->env , *this );
958 indexerScopedMutate( node->result, *this );
[2a7b3ca]959
[e0886db]960 for ( auto& expr : node->args ) {
[296b2be]961 expr = mutateExpression( expr );
962 }
963
964 MUTATE_END( Expression, node );
965}
966
[e0886db]967//--------------------------------------------------------------------------
968// NameExpr
[13932f14]969template< typename pass_type >
[ab904dc]970void PassVisitor< pass_type >::visit( NameExpr * node ) {
[e0886db]971 VISIT_START( node );
972
973 indexerScopedAccept( node->result, *this );
974
975 VISIT_END( node );
[13932f14]976}
977
978template< typename pass_type >
[e0886db]979Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) {
980 MUTATE_START( node );
981
982 indexerScopedMutate( node->env , *this );
983 indexerScopedMutate( node->result, *this );
984
985 MUTATE_END( Expression, node );
[13932f14]986}
987
[e0886db]988//--------------------------------------------------------------------------
989// CastExpr
[a5f0529]990template< typename pass_type >
[e0886db]991void PassVisitor< pass_type >::visit( CastExpr * node ) {
992 VISIT_START( node );
993
994 indexerScopedAccept( node->result, *this );
995 maybeAccept ( node->arg , *this );
996
997 VISIT_END( node );
[a5f0529]998}
999
[13932f14]1000template< typename pass_type >
[e0886db]1001Expression * PassVisitor< pass_type >::mutate( CastExpr * node ) {
1002 MUTATE_START( node );
1003
1004 indexerScopedMutate( node->env , *this );
1005 indexerScopedMutate( node->result, *this );
1006 maybeMutateRef ( node->arg , *this );
1007
1008 MUTATE_END( Expression, node );
[13932f14]1009}
1010
[e0886db]1011//--------------------------------------------------------------------------
1012// VirtualCastExpr
[13932f14]1013template< typename pass_type >
[e0886db]1014void PassVisitor< pass_type >::visit( VirtualCastExpr * node ) {
1015 VISIT_START( node );
1016
1017 indexerScopedAccept( node->result, *this );
1018 maybeAccept( node->arg, *this );
1019
1020 VISIT_END( node );
[13932f14]1021}
1022
1023template< typename pass_type >
[e0886db]1024Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) {
1025 MUTATE_START( node );
1026
1027 indexerScopedMutate( node->env , *this );
1028 indexerScopedMutate( node->result, *this );
1029 maybeMutateRef ( node->arg , *this );
1030
1031 MUTATE_END( Expression, node );
[13932f14]1032}
1033
[e0886db]1034//--------------------------------------------------------------------------
1035// AddressExpr
[13932f14]1036template< typename pass_type >
[e0886db]1037void PassVisitor< pass_type >::visit( AddressExpr * node ) {
1038 VISIT_START( node );
1039
1040 indexerScopedAccept( node->result, *this );
1041 maybeAccept ( node->arg , *this );
1042
1043 VISIT_END( node );
[13932f14]1044}
1045
1046template< typename pass_type >
[e0886db]1047Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) {
1048 MUTATE_START( node );
1049
1050 indexerScopedMutate( node->env , *this );
1051 indexerScopedMutate( node->result, *this );
1052 maybeMutateRef ( node->arg , *this );
1053
1054 MUTATE_END( Expression, node );
1055}
1056
1057//--------------------------------------------------------------------------
1058// LabelAddressExpr
1059template< typename pass_type >
1060void PassVisitor< pass_type >::visit( LabelAddressExpr * node ) {
1061 VISIT_START( node );
1062
1063 indexerScopedAccept( node->result, *this );
1064
1065 VISIT_END( node );
1066}
1067
1068template< typename pass_type >
1069Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) {
1070 MUTATE_START( node );
1071
1072 indexerScopedMutate( node->env , *this );
1073 indexerScopedMutate( node->result, *this );
1074
1075 MUTATE_END( Expression, node );
1076}
1077
1078//--------------------------------------------------------------------------
1079// UntypedMemberExpr
1080template< typename pass_type >
1081void PassVisitor< pass_type >::visit( UntypedMemberExpr * node ) {
1082 VISIT_START( node );
1083
1084 indexerScopedAccept( node->result , *this );
1085 maybeAccept ( node->aggregate, *this );
1086 maybeAccept ( node->member , *this );
1087
1088 VISIT_END( node );
[13932f14]1089}
1090
[e0886db]1091template< typename pass_type >
1092Expression * PassVisitor< pass_type >::mutate( UntypedMemberExpr * node ) {
1093 MUTATE_START( node );
1094
1095 indexerScopedMutate( node->env , *this );
1096 indexerScopedMutate( node->result , *this );
1097 maybeMutateRef ( node->aggregate, *this );
1098 maybeMutateRef ( node->member , *this );
1099
1100 MUTATE_END( Expression, node );
1101}
1102
1103//--------------------------------------------------------------------------
1104// MemberExpr
1105template< typename pass_type >
1106void PassVisitor< pass_type >::visit( MemberExpr * node ) {
1107 VISIT_START( node );
1108
1109 indexerScopedAccept( node->result , *this );
1110 maybeAccept ( node->aggregate, *this );
1111
1112 VISIT_END( node );
1113}
1114
1115template< typename pass_type >
1116Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) {
1117 MUTATE_START( node );
1118
1119 indexerScopedMutate( node->env , *this );
1120 indexerScopedMutate( node->result , *this );
1121 maybeMutateRef ( node->aggregate, *this );
1122
1123 MUTATE_END( Expression, node );
1124}
1125
1126//--------------------------------------------------------------------------
1127// VariableExpr
1128template< typename pass_type >
1129void PassVisitor< pass_type >::visit( VariableExpr * node ) {
1130 VISIT_START( node );
1131
1132 indexerScopedAccept( node->result, *this );
1133
1134 VISIT_END( node );
1135}
1136
1137template< typename pass_type >
1138Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) {
1139 MUTATE_START( node );
1140
1141 indexerScopedMutate( node->env , *this );
1142 indexerScopedMutate( node->result, *this );
1143
1144 MUTATE_END( Expression, node );
1145}
1146
1147//--------------------------------------------------------------------------
1148// ConstantExpr
[13932f14]1149template< typename pass_type >
[ab904dc]1150void PassVisitor< pass_type >::visit( ConstantExpr * node ) {
[e0886db]1151 VISIT_START( node );
1152
1153 indexerScopedAccept( node->result , *this );
1154 maybeAccept ( &node->constant, *this );
1155
1156 VISIT_END( node );
[13932f14]1157}
1158
[e0886db]1159template< typename pass_type >
1160Expression * PassVisitor< pass_type >::mutate( ConstantExpr * node ) {
1161 MUTATE_START( node );
1162
1163 indexerScopedMutate( node->env , *this );
1164 indexerScopedMutate( node->result, *this );
1165 node->constant = *maybeMutate( &node->constant, *this );
1166
1167 MUTATE_END( Expression, node );
1168}
1169
1170//--------------------------------------------------------------------------
1171// SizeofExpr
[13932f14]1172template< typename pass_type >
[ab904dc]1173void PassVisitor< pass_type >::visit( SizeofExpr * node ) {
[e0886db]1174 VISIT_START( node );
1175
1176 indexerScopedAccept( node->result, *this );
1177 if ( node->get_isType() ) {
1178 maybeAccept( node->type, *this );
1179 } else {
1180 maybeAccept( node->expr, *this );
1181 }
1182
1183 VISIT_END( node );
[13932f14]1184}
1185
[e0886db]1186template< typename pass_type >
1187Expression * PassVisitor< pass_type >::mutate( SizeofExpr * node ) {
1188 MUTATE_START( node );
1189
1190 indexerScopedMutate( node->env , *this );
1191 indexerScopedMutate( node->result, *this );
1192 if ( node->get_isType() ) {
1193 maybeMutateRef( node->type, *this );
1194 } else {
1195 maybeMutateRef( node->expr, *this );
1196 }
1197
1198 MUTATE_END( Expression, node );
1199}
1200
1201//--------------------------------------------------------------------------
1202// AlignofExpr
[13932f14]1203template< typename pass_type >
[ab904dc]1204void PassVisitor< pass_type >::visit( AlignofExpr * node ) {
[e0886db]1205 VISIT_START( node );
1206
1207 indexerScopedAccept( node->result, *this );
1208 if ( node->get_isType() ) {
1209 maybeAccept( node->type, *this );
1210 } else {
1211 maybeAccept( node->expr, *this );
1212 }
1213
1214 VISIT_END( node );
[13932f14]1215}
1216
[e0886db]1217template< typename pass_type >
1218Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) {
1219 MUTATE_START( node );
1220
1221 indexerScopedMutate( node->env , *this );
1222 indexerScopedMutate( node->result, *this );
1223 if ( node->get_isType() ) {
1224 maybeMutateRef( node->type, *this );
1225 } else {
1226 maybeMutateRef( node->expr, *this );
1227 }
1228
1229 MUTATE_END( Expression, node );
1230}
1231
1232//--------------------------------------------------------------------------
1233// UntypedOffsetofExpr
[13932f14]1234template< typename pass_type >
[ab904dc]1235void PassVisitor< pass_type >::visit( UntypedOffsetofExpr * node ) {
[e0886db]1236 VISIT_START( node );
1237
1238 indexerScopedAccept( node->result, *this );
1239 maybeAccept ( node->type , *this );
1240
1241 VISIT_END( node );
[13932f14]1242}
1243
[e0886db]1244template< typename pass_type >
1245Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) {
1246 MUTATE_START( node );
1247
1248 indexerScopedMutate( node->env , *this );
1249 indexerScopedMutate( node->result, *this );
1250 maybeMutateRef ( node->type , *this );
1251
1252 MUTATE_END( Expression, node );
1253}
1254
1255//--------------------------------------------------------------------------
1256// OffsetofExpr
[13932f14]1257template< typename pass_type >
[ab904dc]1258void PassVisitor< pass_type >::visit( OffsetofExpr * node ) {
[e0886db]1259 VISIT_START( node );
1260
1261 indexerScopedAccept( node->result, *this );
1262 maybeAccept ( node->type , *this );
1263 maybeAccept ( node->member, *this );
1264
1265 VISIT_END( node );
[13932f14]1266}
1267
[e0886db]1268template< typename pass_type >
1269Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) {
1270 MUTATE_START( node );
1271
1272 indexerScopedMutate( node->env , *this );
1273 indexerScopedMutate( node->result, *this );
1274 maybeMutateRef ( node->type , *this );
1275 maybeMutateRef ( node->member, *this );
1276
1277 MUTATE_END( Expression, node );
1278}
1279
1280//--------------------------------------------------------------------------
1281// OffsetPackExpr
[13932f14]1282template< typename pass_type >
[ab904dc]1283void PassVisitor< pass_type >::visit( OffsetPackExpr * node ) {
[e0886db]1284 VISIT_START( node );
1285
1286 indexerScopedAccept( node->result, *this );
1287 maybeAccept ( node->type , *this );
1288
1289 VISIT_END( node );
[13932f14]1290}
1291
[e0886db]1292template< typename pass_type >
1293Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) {
1294 MUTATE_START( node );
1295
1296 indexerScopedMutate( node->env , *this );
1297 indexerScopedMutate( node->result, *this );
1298 maybeMutateRef ( node->type , *this );
1299
1300 MUTATE_END( Expression, node );
1301}
1302
1303//--------------------------------------------------------------------------
1304// AttrExpr
[13932f14]1305template< typename pass_type >
[ab904dc]1306void PassVisitor< pass_type >::visit( AttrExpr * node ) {
[e0886db]1307 VISIT_START( node );
1308
1309 indexerScopedAccept( node->result, *this );
1310 if ( node->get_isType() ) {
1311 maybeAccept( node->type, *this );
1312 } else {
1313 maybeAccept( node->expr, *this );
1314 }
1315
1316 VISIT_END( node );
1317}
1318
1319template< typename pass_type >
1320Expression * PassVisitor< pass_type >::mutate( AttrExpr * node ) {
1321 MUTATE_START( node );
1322
1323 indexerScopedMutate( node->env , *this );
1324 indexerScopedMutate( node->result, *this );
1325 if ( node->get_isType() ) {
1326 maybeMutateRef( node->type, *this );
1327 } else {
1328 maybeMutateRef( node->expr, *this );
1329 }
1330
1331 MUTATE_END( Expression, node );
[13932f14]1332}
1333
[e0886db]1334//--------------------------------------------------------------------------
1335// LogicalExpr
[13932f14]1336template< typename pass_type >
[ab904dc]1337void PassVisitor< pass_type >::visit( LogicalExpr * node ) {
[e0886db]1338 VISIT_START( node );
1339
1340 indexerScopedAccept( node->result, *this );
1341 maybeAccept ( node->arg1 , *this );
1342 maybeAccept ( node->arg2 , *this );
1343
1344 VISIT_END( node );
1345}
1346
1347template< typename pass_type >
1348Expression * PassVisitor< pass_type >::mutate( LogicalExpr * node ) {
1349 MUTATE_START( node );
1350
1351 indexerScopedMutate( node->env , *this );
1352 indexerScopedMutate( node->result, *this );
1353 maybeMutateRef ( node->arg1 , *this );
1354 maybeMutateRef ( node->arg2 , *this );
1355
1356 MUTATE_END( Expression, node );
[13932f14]1357}
1358
[e0886db]1359//--------------------------------------------------------------------------
1360// ConditionalExpr
[13932f14]1361template< typename pass_type >
[ab904dc]1362void PassVisitor< pass_type >::visit( ConditionalExpr * node ) {
[e0886db]1363 VISIT_START( node );
1364
1365 indexerScopedAccept( node->result, *this );
1366 maybeAccept ( node->arg1 , *this );
1367 maybeAccept ( node->arg2 , *this );
1368 maybeAccept ( node->arg3 , *this );
1369
1370 VISIT_END( node );
[13932f14]1371}
1372
[e0886db]1373template< typename pass_type >
1374Expression * PassVisitor< pass_type >::mutate( ConditionalExpr * node ) {
1375 MUTATE_START( node );
1376
1377 indexerScopedMutate( node->env , *this );
1378 indexerScopedMutate( node->result, *this );
1379 maybeMutateRef ( node->arg1 , *this );
1380 maybeMutateRef ( node->arg2 , *this );
1381 maybeMutateRef ( node->arg3 , *this );
1382
1383 MUTATE_END( Expression, node );
1384}
1385
1386//--------------------------------------------------------------------------
1387// CommaExpr
[13932f14]1388template< typename pass_type >
[ab904dc]1389void PassVisitor< pass_type >::visit( CommaExpr * node ) {
[e0886db]1390 VISIT_START( node );
1391
1392 indexerScopedAccept( node->result, *this );
1393 maybeAccept ( node->arg1 , *this );
1394 maybeAccept ( node->arg2 , *this );
1395
1396 VISIT_END( node );
1397}
1398
1399template< typename pass_type >
1400Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) {
1401 MUTATE_START( node );
1402
1403 indexerScopedMutate( node->env , *this );
1404 indexerScopedMutate( node->result, *this );
1405 maybeMutateRef ( node->arg1 , *this );
1406 maybeMutateRef ( node->arg2 , *this );
1407
1408 MUTATE_END( Expression, node );
[13932f14]1409}
1410
[e0886db]1411//--------------------------------------------------------------------------
1412// TypeExpr
[13932f14]1413template< typename pass_type >
[ab904dc]1414void PassVisitor< pass_type >::visit( TypeExpr * node ) {
[e0886db]1415 VISIT_START( node );
1416
1417 indexerScopedAccept( node->result, *this );
1418 maybeAccept ( node->type, *this );
1419
1420 VISIT_END( node );
[13932f14]1421}
1422
[e0886db]1423template< typename pass_type >
1424Expression * PassVisitor< pass_type >::mutate( TypeExpr * node ) {
1425 MUTATE_START( node );
1426
1427 indexerScopedMutate( node->env , *this );
1428 indexerScopedMutate( node->result, *this );
1429 maybeMutateRef ( node->type , *this );
1430
1431 MUTATE_END( Expression, node );
1432}
1433
1434//--------------------------------------------------------------------------
1435// AsmExpr
[13932f14]1436template< typename pass_type >
[ab904dc]1437void PassVisitor< pass_type >::visit( AsmExpr * node ) {
[e0886db]1438 VISIT_START( node );
1439
1440 indexerScopedAccept( node->result , *this );
1441 maybeAccept ( node->inout , *this );
1442 maybeAccept ( node->constraint, *this );
1443 maybeAccept ( node->operand , *this );
1444
1445 VISIT_END( node );
[13932f14]1446}
1447
[e0886db]1448template< typename pass_type >
1449Expression * PassVisitor< pass_type >::mutate( AsmExpr * node ) {
1450 MUTATE_START( node );
1451
1452 indexerScopedMutate( node->env , *this );
1453 indexerScopedMutate( node->result , *this );
1454 maybeMutateRef ( node->inout , *this );
1455 maybeMutateRef ( node->constraint, *this );
1456 maybeMutateRef ( node->operand , *this );
1457
1458 MUTATE_END( Expression, node );
1459}
1460
1461//--------------------------------------------------------------------------
1462// ImplicitCopyCtorExpr
[13932f14]1463template< typename pass_type >
[ab904dc]1464void PassVisitor< pass_type >::visit( ImplicitCopyCtorExpr * node ) {
[e0886db]1465 VISIT_START( node );
1466
1467 indexerScopedAccept( node->result , *this );
1468 maybeAccept ( node->callExpr , *this );
[9dcb653]1469 maybeAccept ( node->tempDecls , *this );
1470 maybeAccept ( node->returnDecls, *this );
1471 maybeAccept ( node->dtors , *this );
[e0886db]1472
1473 VISIT_END( node );
1474}
1475
1476template< typename pass_type >
1477Expression * PassVisitor< pass_type >::mutate( ImplicitCopyCtorExpr * node ) {
1478 MUTATE_START( node );
1479
1480 indexerScopedMutate( node->env , *this );
1481 indexerScopedMutate( node->result , *this );
1482 maybeMutateRef ( node->callExpr , *this );
[9dcb653]1483 maybeMutateRef ( node->tempDecls , *this );
1484 maybeMutateRef ( node->returnDecls, *this );
1485 maybeMutateRef ( node->dtors , *this );
[e0886db]1486
1487 MUTATE_END( Expression, node );
[13932f14]1488}
1489
[e0886db]1490//--------------------------------------------------------------------------
1491// ConstructorExpr
[13932f14]1492template< typename pass_type >
[ab904dc]1493void PassVisitor< pass_type >::visit( ConstructorExpr * node ) {
[e0886db]1494 VISIT_START( node );
1495
1496 indexerScopedAccept( node->result , *this );
1497 maybeAccept ( node->callExpr, *this );
1498
1499 VISIT_END( node );
1500}
1501
1502template< typename pass_type >
1503Expression * PassVisitor< pass_type >::mutate( ConstructorExpr * node ) {
1504 MUTATE_START( node );
1505
1506 indexerScopedMutate( node->env , *this );
1507 indexerScopedMutate( node->result , *this );
1508 maybeMutateRef ( node->callExpr, *this );
1509
1510 MUTATE_END( Expression, node );
[13932f14]1511}
1512
[e0886db]1513//--------------------------------------------------------------------------
1514// CompoundLiteralExpr
[13932f14]1515template< typename pass_type >
[ab904dc]1516void PassVisitor< pass_type >::visit( CompoundLiteralExpr * node ) {
[e0886db]1517 VISIT_START( node );
1518
1519 indexerScopedAccept( node->result , *this );
1520 maybeAccept ( node->initializer, *this );
1521
1522 VISIT_END( node );
[13932f14]1523}
1524
[e0886db]1525template< typename pass_type >
1526Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) {
1527 MUTATE_START( node );
1528
1529 indexerScopedMutate( node->env , *this );
1530 indexerScopedMutate( node->result , *this );
1531 maybeMutateRef ( node->initializer, *this );
1532
1533 MUTATE_END( Expression, node );
1534}
1535
1536//--------------------------------------------------------------------------
1537// RangeExpr
[13932f14]1538template< typename pass_type >
[ab904dc]1539void PassVisitor< pass_type >::visit( RangeExpr * node ) {
[e0886db]1540 VISIT_START( node );
1541
1542 indexerScopedAccept( node->result, *this );
1543 maybeAccept ( node->low , *this );
1544 maybeAccept ( node->high , *this );
1545
1546 VISIT_END( node );
[13932f14]1547}
1548
[e0886db]1549template< typename pass_type >
1550Expression * PassVisitor< pass_type >::mutate( RangeExpr * node ) {
1551 MUTATE_START( node );
1552
1553 indexerScopedMutate( node->env , *this );
1554 indexerScopedMutate( node->result, *this );
1555 maybeMutateRef ( node->low , *this );
1556 maybeMutateRef ( node->high , *this );
1557
1558 MUTATE_END( Expression, node );
1559}
1560
1561//--------------------------------------------------------------------------
1562// UntypedTupleExpr
[13932f14]1563template< typename pass_type >
[ab904dc]1564void PassVisitor< pass_type >::visit( UntypedTupleExpr * node ) {
[e0886db]1565 VISIT_START( node );
1566
1567 indexerScopedAccept( node->result, *this );
[9dcb653]1568 maybeAccept ( node->exprs , *this );
[e0886db]1569
1570 VISIT_END( node );
1571}
1572
1573template< typename pass_type >
1574Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) {
1575 MUTATE_START( node );
1576
1577 indexerScopedMutate( node->env , *this );
1578 indexerScopedMutate( node->result, *this );
[9dcb653]1579 maybeMutateRef ( node->exprs , *this );
[e0886db]1580
1581 MUTATE_END( Expression, node );
1582}
1583
1584//--------------------------------------------------------------------------
1585// TupleExpr
1586template< typename pass_type >
1587void PassVisitor< pass_type >::visit( TupleExpr * node ) {
1588 VISIT_START( node );
1589
1590 indexerScopedAccept( node->result, *this );
1591 maybeAccept ( node->exprs , *this );
1592
1593 VISIT_END( node );
1594}
1595
1596template< typename pass_type >
1597Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) {
1598 MUTATE_START( node );
1599
1600 indexerScopedMutate( node->env , *this );
1601 indexerScopedMutate( node->result, *this );
[9dcb653]1602 maybeMutateRef ( node->exprs , *this );
[e0886db]1603
1604 MUTATE_END( Expression, node );
1605}
1606
1607//--------------------------------------------------------------------------
1608// TupleIndexExpr
1609template< typename pass_type >
1610void PassVisitor< pass_type >::visit( TupleIndexExpr * node ) {
1611 VISIT_START( node );
1612
1613 indexerScopedAccept( node->result, *this );
1614 maybeAccept ( node->tuple , *this );
1615
1616 VISIT_END( node );
1617}
1618
1619template< typename pass_type >
1620Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) {
1621 MUTATE_START( node );
1622
1623 indexerScopedMutate( node->env , *this );
1624 indexerScopedMutate( node->result, *this );
1625 maybeMutateRef ( node->tuple , *this );
1626
1627 MUTATE_END( Expression, node );
1628}
1629
1630//--------------------------------------------------------------------------
1631// TupleAssignExpr
1632template< typename pass_type >
1633void PassVisitor< pass_type >::visit( TupleAssignExpr * node ) {
1634 VISIT_START( node );
1635
1636 indexerScopedAccept( node->result , *this );
1637 maybeAccept ( node->stmtExpr, *this );
1638
1639 VISIT_END( node );
[13932f14]1640}
1641
1642template< typename pass_type >
[e0886db]1643Expression * PassVisitor< pass_type >::mutate( TupleAssignExpr * node ) {
1644 MUTATE_START( node );
[13932f14]1645
[e0886db]1646 indexerScopedMutate( node->env , *this );
1647 indexerScopedMutate( node->result , *this );
1648 maybeMutateRef ( node->stmtExpr, *this );
[13932f14]1649
[e0886db]1650 MUTATE_END( Expression, node );
[13932f14]1651}
1652
[9c1600c]1653//--------------------------------------------------------------------------
[e0886db]1654// StmtExpr
[13932f14]1655template< typename pass_type >
[ab904dc]1656void PassVisitor< pass_type >::visit( StmtExpr * node ) {
[9c1600c]1657 VISIT_START( node );
1658
1659 // don't want statements from outer CompoundStmts to be added to this StmtExpr
1660 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() );
1661 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
1662 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
1663
[e0886db]1664 indexerScopedAccept( node->result , *this );
1665 maybeAccept ( node->statements , *this );
[9dcb653]1666 maybeAccept ( node->returnDecls, *this );
1667 maybeAccept ( node->dtors , *this );
[9c1600c]1668
1669 VISIT_END( node );
[13932f14]1670}
1671
[296b2be]1672template< typename pass_type >
1673Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) {
1674 MUTATE_START( node );
[4551a6e]1675
[296b2be]1676 // don't want statements from outer CompoundStmts to be added to this StmtExpr
[134322e]1677 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() );
1678 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
1679 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
[296b2be]1680
[e0886db]1681 indexerScopedMutate( node->result , *this );
1682 maybeMutateRef ( node->statements , *this );
[9dcb653]1683 maybeMutateRef ( node->returnDecls, *this );
1684 maybeMutateRef ( node->dtors , *this );
[296b2be]1685
1686 MUTATE_END( Expression, node );
1687}
1688
[e0886db]1689//--------------------------------------------------------------------------
1690// UniqueExpr
[13932f14]1691template< typename pass_type >
[ab904dc]1692void PassVisitor< pass_type >::visit( UniqueExpr * node ) {
[e0886db]1693 VISIT_START( node );
1694
1695 indexerScopedAccept( node->result, *this );
1696 maybeAccept ( node->expr , *this );
1697
1698 VISIT_END( node );
1699}
1700
1701template< typename pass_type >
1702Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) {
1703 MUTATE_START( node );
1704
1705 indexerScopedMutate( node->env , *this );
1706 indexerScopedMutate( node->result, *this );
1707 maybeMutateRef ( node->expr , *this );
1708
1709 MUTATE_END( Expression, node );
[13932f14]1710}
1711
1712template< typename pass_type >
[ab904dc]1713void PassVisitor< pass_type >::visit( VoidType * node ) {
[4551a6e]1714 VISIT_BODY( node );
[13932f14]1715}
1716
1717template< typename pass_type >
[ab904dc]1718void PassVisitor< pass_type >::visit( BasicType * node ) {
[4551a6e]1719 VISIT_BODY( node );
[13932f14]1720}
1721
1722template< typename pass_type >
[ab904dc]1723void PassVisitor< pass_type >::visit( PointerType * node ) {
[4551a6e]1724 VISIT_BODY( node );
[13932f14]1725}
1726
1727template< typename pass_type >
[ab904dc]1728void PassVisitor< pass_type >::visit( ArrayType * node ) {
[4551a6e]1729 VISIT_BODY( node );
[13932f14]1730}
1731
[6b9b047]1732template< typename pass_type >
1733void PassVisitor< pass_type >::visit( ReferenceType * node ) {
1734 VISIT_BODY( node );
1735}
1736
[13932f14]1737template< typename pass_type >
[ab904dc]1738void PassVisitor< pass_type >::visit( FunctionType * node ) {
[4551a6e]1739 VISIT_BODY( node );
[13932f14]1740}
1741
[e0886db]1742//--------------------------------------------------------------------------
1743// StructInstType
[13932f14]1744template< typename pass_type >
[ab904dc]1745void PassVisitor< pass_type >::visit( StructInstType * node ) {
[e0886db]1746 VISIT_START( node );
1747
1748 indexerAddStruct( node->name );
1749
1750 {
1751 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
1752 maybeAccept( node->forall , *this );
1753 maybeAccept( node->parameters, *this );
1754 }
1755
1756 VISIT_END( node );
1757}
1758
1759template< typename pass_type >
1760Type * PassVisitor< pass_type >::mutate( StructInstType * node ) {
1761 MUTATE_START( node );
1762
1763 indexerAddStruct( node->name );
1764
1765 {
1766 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
1767 maybeMutateRef( node->forall , *this );
1768 maybeMutateRef( node->parameters, *this );
1769 }
1770
1771 MUTATE_END( Type, node );
[13932f14]1772}
1773
[e0886db]1774//--------------------------------------------------------------------------
1775// UnionInstType
[13932f14]1776template< typename pass_type >
[ab904dc]1777void PassVisitor< pass_type >::visit( UnionInstType * node ) {
[e0886db]1778 VISIT_START( node );
1779
1780 indexerAddStruct( node->name );
1781
1782 {
1783 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
1784 maybeAccept( node->forall , *this );
1785 maybeAccept( node->parameters, *this );
1786 }
1787
1788 VISIT_END( node );
1789}
1790
1791template< typename pass_type >
1792Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) {
1793 MUTATE_START( node );
1794
1795 indexerAddStruct( node->name );
1796
1797 {
1798 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } );
1799 maybeMutateRef( node->forall , *this );
1800 maybeMutateRef( node->parameters, *this );
1801 }
1802
1803 MUTATE_END( Type, node );
[13932f14]1804}
1805
[e0886db]1806//--------------------------------------------------------------------------
1807// EnumInstType
[13932f14]1808template< typename pass_type >
[ab904dc]1809void PassVisitor< pass_type >::visit( EnumInstType * node ) {
[4551a6e]1810 VISIT_BODY( node );
[13932f14]1811}
1812
[e0886db]1813template< typename pass_type >
1814Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) {
1815 MUTATE_BODY( Type, node );
1816}
1817
1818//--------------------------------------------------------------------------
1819// TraitInstType
[13932f14]1820template< typename pass_type >
[ab904dc]1821void PassVisitor< pass_type >::visit( TraitInstType * node ) {
[e0886db]1822 VISIT_START( node );
1823
1824 maybeAccept( node->forall , *this );
1825 maybeAccept( node->parameters, *this );
1826
1827 VISIT_END( node );
1828}
1829
1830template< typename pass_type >
1831Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) {
1832 MUTATE_START( node );
1833
1834 maybeMutateRef( node->forall , *this );
1835 maybeMutateRef( node->parameters, *this );
1836
1837 MUTATE_END( Type, node );
[13932f14]1838}
1839
[e0886db]1840//--------------------------------------------------------------------------
1841// TypeInstType
[13932f14]1842template< typename pass_type >
[ab904dc]1843void PassVisitor< pass_type >::visit( TypeInstType * node ) {
[4551a6e]1844 VISIT_BODY( node );
[13932f14]1845}
1846
1847template< typename pass_type >
[ab904dc]1848void PassVisitor< pass_type >::visit( TupleType * node ) {
[4551a6e]1849 VISIT_BODY( node );
[13932f14]1850}
1851
1852template< typename pass_type >
[ab904dc]1853void PassVisitor< pass_type >::visit( TypeofType * node ) {
[4551a6e]1854 VISIT_BODY( node );
[13932f14]1855}
1856
1857template< typename pass_type >
[ab904dc]1858void PassVisitor< pass_type >::visit( AttrType * node ) {
[4551a6e]1859 VISIT_BODY( node );
[13932f14]1860}
1861
1862template< typename pass_type >
[ab904dc]1863void PassVisitor< pass_type >::visit( VarArgsType * node ) {
[4551a6e]1864 VISIT_BODY( node );
[13932f14]1865}
1866
1867template< typename pass_type >
[ab904dc]1868void PassVisitor< pass_type >::visit( ZeroType * node ) {
[4551a6e]1869 VISIT_BODY( node );
[13932f14]1870}
1871
1872template< typename pass_type >
[ab904dc]1873void PassVisitor< pass_type >::visit( OneType * node ) {
[4551a6e]1874 VISIT_BODY( node );
[13932f14]1875}
1876
[9c1600c]1877//--------------------------------------------------------------------------
[e0886db]1878// SingleInit
[13932f14]1879template< typename pass_type >
[ab904dc]1880void PassVisitor< pass_type >::visit( SingleInit * node ) {
[9c1600c]1881 VISIT_START( node );
1882
1883 visitExpression( node->get_value() );
1884
1885 VISIT_END( node );
[13932f14]1886}
1887
[296b2be]1888template< typename pass_type >
1889Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) {
1890 MUTATE_START( node );
1891
1892 node->set_value( mutateExpression( node->get_value() ) );
1893
1894 MUTATE_END( Initializer, node );
1895}
1896
[13932f14]1897template< typename pass_type >
[ab904dc]1898void PassVisitor< pass_type >::visit( ListInit * node ) {
[4551a6e]1899 VISIT_BODY( node );
[13932f14]1900}
1901
1902template< typename pass_type >
[ab904dc]1903void PassVisitor< pass_type >::visit( ConstructorInit * node ) {
[4551a6e]1904 VISIT_BODY( node );
[13932f14]1905}
1906
1907template< typename pass_type >
[ab904dc]1908void PassVisitor< pass_type >::visit( Subrange * node ) {
[4551a6e]1909 VISIT_BODY( node );
[13932f14]1910}
1911
1912template< typename pass_type >
[ab904dc]1913void PassVisitor< pass_type >::visit( Constant * node ) {
[4551a6e]1914 VISIT_BODY( node );
[13932f14]1915}
[ab904dc]1916
1917//---------------------------------------------------------------------------------------------------------------
1918template< typename pass_type >
1919Type * PassVisitor< pass_type >::mutate( VoidType * node ) {
1920 MUTATE_BODY( Type, node );
1921}
1922
1923template< typename pass_type >
1924Type * PassVisitor< pass_type >::mutate( BasicType * node ) {
1925 MUTATE_BODY( Type, node );
1926}
1927
1928template< typename pass_type >
1929Type * PassVisitor< pass_type >::mutate( PointerType * node ) {
1930 MUTATE_BODY( Type, node );
1931}
1932
1933template< typename pass_type >
1934Type * PassVisitor< pass_type >::mutate( ArrayType * node ) {
1935 MUTATE_BODY( Type, node );
1936}
1937
1938template< typename pass_type >
[6b9b047]1939Type * PassVisitor< pass_type >::mutate( ReferenceType * node ) {
1940 MUTATE_BODY( Type, node );
1941}
1942
1943template< typename pass_type >
[ab904dc]1944Type * PassVisitor< pass_type >::mutate( FunctionType * node ) {
1945 MUTATE_BODY( Type, node );
1946}
1947
1948template< typename pass_type >
1949Type * PassVisitor< pass_type >::mutate( TypeInstType * node ) {
1950 MUTATE_BODY( Type, node );
1951}
1952
1953template< typename pass_type >
1954Type * PassVisitor< pass_type >::mutate( TupleType * node ) {
1955 MUTATE_BODY( Type, node );
1956}
1957
1958template< typename pass_type >
1959Type * PassVisitor< pass_type >::mutate( TypeofType * node ) {
1960 MUTATE_BODY( Type, node );
1961}
1962
1963template< typename pass_type >
1964Type * PassVisitor< pass_type >::mutate( AttrType * node ) {
1965 MUTATE_BODY( Type, node );
1966}
1967
1968template< typename pass_type >
1969Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) {
1970 MUTATE_BODY( Type, node );
1971}
1972
1973template< typename pass_type >
1974Type * PassVisitor< pass_type >::mutate( ZeroType * node ) {
1975 MUTATE_BODY( Type, node );
1976}
1977
1978template< typename pass_type >
1979Type * PassVisitor< pass_type >::mutate( OneType * node ) {
1980 MUTATE_BODY( Type, node );
1981}
1982
1983template< typename pass_type >
1984Initializer * PassVisitor< pass_type >::mutate( ListInit * node ) {
1985 MUTATE_BODY( Initializer, node );
1986}
1987
1988template< typename pass_type >
1989Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) {
1990 MUTATE_BODY( Initializer, node );
1991}
1992
1993template< typename pass_type >
1994Subrange * PassVisitor< pass_type >::mutate( Subrange * node ) {
1995 MUTATE_BODY( Subrange, node );
1996}
1997
1998template< typename pass_type >
1999Constant * PassVisitor< pass_type >::mutate( Constant * node ) {
2000 MUTATE_BODY( Constant, node );
[4551a6e]2001}
Note: See TracBrowser for help on using the repository browser.