Changeset db4ecc5
- Timestamp:
- Apr 14, 2016, 3:22:42 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 70a06f6
- Parents:
- 7eabc25
- Location:
- src
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/FixInit.cc
r7eabc25 rdb4ecc5 10 10 // Created On : Wed Jan 13 16:29:30 2016 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Mar 31 13:54:58201612 // Last Modified On : Thu Apr 14 15:19:11 2016 13 13 // Update Count : 30 14 14 // … … 17 17 #include <list> 18 18 #include "RemoveInit.h" 19 #include "ResolvExpr/Resolver.h" 19 20 #include "SynTree/Declaration.h" 20 21 #include "SynTree/Type.h" … … 23 24 #include "SynTree/Initializer.h" 24 25 #include "SynTree/Mutator.h" 26 #include "SymTab/Indexer.h" 25 27 #include "GenPoly/PolyMutator.h" 26 28 … … 31 33 } 32 34 35 class InsertImplicitCalls : public Mutator { 36 public: 37 /// wrap function application expressions as ImplicitCopyCtorExpr nodes 38 /// so that it is easy to identify which function calls need their parameters 39 /// to be copy constructed 40 static void insert( std::list< Declaration * > & translationUnit ); 41 42 virtual Expression * mutate( ApplicationExpr * appExpr ); 43 }; 44 45 class ResolveCopyCtors : public SymTab::Indexer { 46 public: 47 /// generate temporary ObjectDecls for each argument and return value of each 48 /// ImplicitCopyCtorExpr, generate/resolve copy construction expressions for each, 49 /// and generate/resolve destructors for both arguments and return value temporaries 50 static void resolveImplicitCalls( std::list< Declaration * > & translationUnit ); 51 52 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ); 53 54 /// create and resolve ctor/dtor expression: fname(var, [cpArg]) 55 ApplicationExpr * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL ); 56 }; 57 33 58 class FixInit : public GenPoly::PolyMutator { 34 59 public: 60 /// expand each object declaration to use its constructor after it is declared. 61 /// insert destructor calls at the appropriate places 35 62 static void fixInitializers( std::list< Declaration * > &translationUnit ); 36 63 37 virtual ObjectDecl* mutate( ObjectDecl *objDecl );64 virtual DeclarationWithType * mutate( ObjectDecl *objDecl ); 38 65 39 66 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ); … … 46 73 }; 47 74 75 class FixCopyCtors : public GenPoly::PolyMutator { 76 public: 77 /// expand ImplicitCopyCtorExpr nodes into the temporary declarations, copy constructors, 78 /// call expression, and destructors 79 static void fixCopyCtors( std::list< Declaration * > &translationUnit ); 80 81 virtual Expression * mutate( ImplicitCopyCtorExpr * impCpCtorExpr ); 82 83 private: 84 // stack of list of statements - used to differentiate scopes 85 std::list< std::list< Statement * > > dtorStmts; 86 }; 87 48 88 void fix( std::list< Declaration * > & translationUnit ) { 89 InsertImplicitCalls::insert( translationUnit ); 90 ResolveCopyCtors::resolveImplicitCalls( translationUnit ); 49 91 FixInit::fixInitializers( translationUnit ); 92 // FixCopyCtors must happen after FixInit, so that destructors are placed correctly 93 FixCopyCtors::fixCopyCtors( translationUnit ); 94 } 95 96 void InsertImplicitCalls::insert( std::list< Declaration * > & translationUnit ) { 97 InsertImplicitCalls inserter; 98 mutateAll( translationUnit, inserter ); 99 } 100 101 void ResolveCopyCtors::resolveImplicitCalls( std::list< Declaration * > & translationUnit ) { 102 ResolveCopyCtors resolver; 103 acceptAll( translationUnit, resolver ); 50 104 } 51 105 … … 55 109 } 56 110 57 ObjectDecl *FixInit::mutate( ObjectDecl *objDecl ) { 111 void FixCopyCtors::fixCopyCtors( std::list< Declaration * > & translationUnit ) { 112 FixCopyCtors fixer; 113 mutateAll( translationUnit, fixer ); 114 } 115 116 Expression * InsertImplicitCalls::mutate( ApplicationExpr * appExpr ) { 117 if ( VariableExpr * function = dynamic_cast< VariableExpr * > ( appExpr->get_function() ) ) { 118 if ( function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) { 119 // optimization: don't need to copy construct in order to call intrinsic functions 120 return appExpr; 121 } else if ( FunctionDecl * func = dynamic_cast< FunctionDecl * > ( function->get_var() ) ) { 122 // if ( ) 123 // // optimization: don't need to copy construct in order to call a copy constructor 124 // return appExpr; 125 } 126 } 127 // wrap each function call so that it is easy to identify nodes that have to be copy constructed 128 appExpr = dynamic_cast< ApplicationExpr * >( Mutator::mutate( appExpr ) ); 129 assert( appExpr ); 130 return new ImplicitCopyCtorExpr( appExpr ); 131 } 132 133 ApplicationExpr * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) { 134 assert( var ); 135 UntypedExpr * untyped = new UntypedExpr( new NameExpr( fname ) ); 136 untyped->get_args().push_back( new AddressExpr( new VariableExpr( var ) ) ); 137 if (cpArg) untyped->get_args().push_back( cpArg ); 138 139 // resolve copy constructor 140 // should only be one alternative for copy ctor and dtor expressions, since 141 // all arguments are fixed (VariableExpr and already resolved expression) 142 ApplicationExpr * resolved = dynamic_cast< ApplicationExpr * >( ResolvExpr::findVoidExpression( untyped, *this ) ); 143 144 assert( resolved ); 145 delete untyped; 146 return resolved; 147 } 148 149 void ResolveCopyCtors::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) { 150 static UniqueName tempNamer("_tmp_cp"); 151 static UniqueName retNamer("_tmp_cp_ret"); 152 153 // resolve function call 154 Expression * newExpr = ResolvExpr::findVoidExpression( impCpCtorExpr->get_callExpr(), *this ); 155 delete impCpCtorExpr->get_callExpr(); 156 ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( newExpr ); 157 assert( appExpr ); 158 impCpCtorExpr->set_callExpr( appExpr ); 159 160 // take each argument and attempt to copy construct it. 161 for ( Expression * & arg : appExpr->get_args() ) { 162 // xxx - need to handle tuple arguments 163 assert( ! arg->get_results().empty() ); 164 ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, arg->get_results().front()->clone(), 0 ); 165 166 // create and resolve copy constructor 167 ApplicationExpr * cpCtor = makeCtorDtor( "?{}", tmp, arg ); 168 169 // if the chosen constructor is intrinsic, the copy is unnecessary, so 170 // don't create the temporary and don't call the copy constructor 171 VariableExpr * function = dynamic_cast< VariableExpr * >( cpCtor->get_function() ); 172 assert( function ); 173 if ( function->get_var()->get_linkage() != LinkageSpec::Intrinsic ) { 174 // replace argument to function call with temporary 175 arg = new VariableExpr( tmp ); 176 impCpCtorExpr->get_tempDecls().push_back( tmp ); 177 impCpCtorExpr->get_copyCtors().push_back( cpCtor ); 178 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", tmp ) ); 179 } 180 } 181 182 // each return value from the call needs to be connected with an ObjectDecl 183 // at the call site, which is initialized with the return value and is destructed 184 // later 185 // xxx - handle multiple return values 186 for ( Type * result : appExpr->get_results() ) { 187 ObjectDecl * ret = new ObjectDecl( retNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, result->clone(), new SingleInit( impCpCtorExpr->get_callExpr() ) ); 188 impCpCtorExpr->get_returnDecls().push_back( ret ); 189 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", ret ) ); 190 } 191 } 192 193 194 Expression * FixCopyCtors::mutate( ImplicitCopyCtorExpr * impCpCtorExpr ) { 195 impCpCtorExpr = dynamic_cast< ImplicitCopyCtorExpr * >( Mutator::mutate( impCpCtorExpr ) ); 196 assert( impCpCtorExpr ); 197 std::cerr << "Running FixCopyCtors on implicit copy ctor..." << std::endl; 198 199 std::list< Expression * > & copyCtors = impCpCtorExpr->get_copyCtors(); 200 std::list< ObjectDecl * > & tempDecls = impCpCtorExpr->get_tempDecls(); 201 std::list< ObjectDecl * > & returnDecls = impCpCtorExpr->get_returnDecls(); 202 std::list< Expression * > & dtors = impCpCtorExpr->get_dtors(); 203 204 // add all temporary declarations and their constructors 205 for ( ObjectDecl * obj : tempDecls ) { 206 assert( ! copyCtors.empty() ); 207 stmtsToAdd.push_back( new DeclStmt( noLabels, obj ) ); 208 stmtsToAdd.push_back( new ExprStmt( noLabels, copyCtors.front() ) ); 209 copyCtors.pop_front(); 210 } 211 212 // add destructors after current statement 213 for ( Expression * dtor : dtors ) { 214 stmtsToAddAfter.push_back( new ExprStmt( noLabels, dtor ) ); 215 } 216 217 // xxx - update to work with multiple return values 218 ObjectDecl * returnDecl = returnDecls.empty() ? NULL : returnDecls.front(); 219 220 // xxx - some of these aren't necessary, and can be removed once this is stable 221 copyCtors.clear(); 222 dtors.clear(); 223 tempDecls.clear(); 224 returnDecls.clear(); 225 226 if ( returnDecl ) { 227 // call is currently attached to first returnDecl 228 stmtsToAdd.push_back( new DeclStmt( noLabels, returnDecl ) ); 229 return new VariableExpr( returnDecl ); 230 } else { 231 // add call expression - if no return values, can call directly 232 return impCpCtorExpr->get_callExpr(); 233 } 234 } 235 236 DeclarationWithType *FixInit::mutate( ObjectDecl *objDecl ) { 237 // first recursively handle pieces of ObjectDecl so that they aren't missed by other visitors 238 // when the init is removed from the ObjectDecl 239 objDecl = dynamic_cast< ObjectDecl * >( Mutator::mutate( objDecl ) ); 240 58 241 if ( ConstructorInit * ctorInit = dynamic_cast< ConstructorInit * >( objDecl->get_init() ) ) { 59 242 // a decision should have been made by the resolver, so ctor and init are not both non-NULL … … 170 353 insertDtors( list->begin(), list->end(), back_inserter( stmtsToAdd ) ); 171 354 } 172 return returnStmt;355 return Mutator::mutate( returnStmt ); 173 356 } 174 357 … … 189 372 assert( false ); 190 373 } 191 return branchStmt;374 return Mutator::mutate( branchStmt ); 192 375 } 193 376 -
src/InitTweak/RemoveInit.cc
r7eabc25 rdb4ecc5 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 11 17:28:43201612 // Last Modified On : Thu Apr 14 15:09:36 2016 13 13 // Update Count : 166 14 14 // … … 42 42 43 43 RemoveInit(); 44 44 45 virtual ObjectDecl * mutate( ObjectDecl *objDecl ); 45 46 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ); … … 63 64 CtorDtor() : inFunction( false ) {} 64 65 65 virtual ObjectDecl* mutate( ObjectDecl * );66 virtual DeclarationWithType * mutate( ObjectDecl * ); 66 67 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ); 67 68 virtual Declaration* mutate( StructDecl *aggregateDecl ); … … 71 72 virtual TypeDecl* mutate( TypeDecl *typeDecl ); 72 73 virtual Declaration* mutate( TypedefDecl *typeDecl ); 74 75 virtual Type * mutate( FunctionType *funcType ); 73 76 74 77 protected: … … 187 190 } 188 191 189 ObjectDecl* CtorDtor::mutate( ObjectDecl * objDecl ) {192 DeclarationWithType * CtorDtor::mutate( ObjectDecl * objDecl ) { 190 193 // hands off if designated or if @= 191 194 if ( tryConstruct( objDecl ) ) { … … 233 236 } 234 237 } 235 return objDecl;238 return Mutator::mutate( objDecl ); 236 239 } 237 240 … … 254 257 TypeDecl* CtorDtor::mutate( TypeDecl *typeDecl ) { return typeDecl; } 255 258 Declaration* CtorDtor::mutate( TypedefDecl *typeDecl ) { return typeDecl; } 259 Type* CtorDtor::mutate( FunctionType *funcType ) { return funcType; } 256 260 257 261 } // namespace InitTweak -
src/ResolvExpr/Resolver.cc
r7eabc25 rdb4ecc5 10 10 // Created On : Sun May 17 12:17:01 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 04 17:11:54201612 // Last Modified On : Thu Apr 14 11:18:12 2016 13 13 // Update Count : 203 14 14 // … … 61 61 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 62 62 void fallbackInit( ConstructorInit * ctorInit ); 63 64 63 std::list< Type * > functionReturn; 65 64 Type *initContext; … … 84 83 } 85 84 85 86 86 namespace { 87 87 void finishExpr( Expression *expr, const TypeEnvironment &env ) { … … 89 89 env.makeSubstitution( *expr->get_env() ); 90 90 } 91 92 Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 93 global_renamer.reset(); 94 TypeEnvironment env; 95 Expression *newExpr = resolveInVoidContext( untyped, indexer, env ); 96 finishExpr( newExpr, env ); 97 return newExpr; 98 } 99 91 } // namespace 92 93 Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 94 global_renamer.reset(); 95 TypeEnvironment env; 96 Expression *newExpr = resolveInVoidContext( untyped, indexer, env ); 97 finishExpr( newExpr, env ); 98 return newExpr; 99 } 100 101 namespace { 100 102 Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 101 103 TypeEnvironment env; … … 484 486 485 487 void Resolver::visit( ConstructorInit *ctorInit ) { 486 TypeEnvironment env;487 488 try { 488 489 maybeAccept( ctorInit->get_ctor(), *this ); -
src/ResolvExpr/Resolver.h
r7eabc25 rdb4ecc5 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Resolver.h -- 7 // Resolver.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:18:34 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun May 17 12:19:32 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 14 15:06:53 2016 13 13 // Update Count : 2 14 14 // … … 24 24 void resolve( std::list< Declaration * > translationUnit ); 25 25 Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer ); 26 Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer ); 26 27 } // namespace ResolvExpr 27 28 -
src/SynTree/Expression.cc
r7eabc25 rdb4ecc5 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Dec 09 14:10:29 201512 // Last Modified On : Thu Apr 14 13:02:28 2016 13 13 // Update Count : 34 14 14 // … … 78 78 79 79 VariableExpr::VariableExpr( DeclarationWithType *_var, Expression *_aname ) : Expression( _aname ), var( _var ) { 80 assert( var ); 81 assert( var->get_type() ); 80 82 add_result( var->get_type()->clone() ); 81 83 for ( std::list< Type* >::iterator i = get_results().begin(); i != get_results().end(); ++i ) { … … 432 434 } 433 435 436 437 ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( ApplicationExpr * callExpr ) : callExpr( callExpr ) { 438 assert( callExpr ); 439 cloneAll( callExpr->get_results(), results ); 440 } 441 442 ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other ) : Expression( other ), callExpr( maybeClone( other.callExpr ) ) { 443 cloneAll( other.results, results ); 444 cloneAll( other.copyCtors, copyCtors ); 445 cloneAll( other.tempDecls, tempDecls ); 446 cloneAll( other.returnDecls, returnDecls ); 447 cloneAll( other.dtors, dtors ); 448 } 449 450 ImplicitCopyCtorExpr::~ImplicitCopyCtorExpr() { 451 delete callExpr; 452 deleteAll( copyCtors ); 453 deleteAll( tempDecls ); 454 deleteAll( returnDecls ); 455 deleteAll( dtors ); 456 } 457 458 void ImplicitCopyCtorExpr::print( std::ostream &os, int indent ) const { 459 os << std::string( indent, ' ' ) << "Implicit Copy Constructor Expression: " << std::endl; 460 assert( callExpr ); 461 callExpr->print( os, indent + 2 ); 462 os << std::endl << std::string( indent, ' ' ) << "with temporaries:" << std::endl; 463 printAll(tempDecls, os, indent+2); 464 os << std::endl << std::string( indent, ' ' ) << "with copyCtors:" << std::endl; 465 printAll(copyCtors, os, indent+2); 466 Expression::print( os, indent ); 467 } 468 434 469 UntypedValofExpr::UntypedValofExpr( const UntypedValofExpr & other ) : Expression( other ), body ( maybeClone( other.body ) ) {} 435 470 -
src/SynTree/Expression.h
r7eabc25 rdb4ecc5 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Dec 09 14:10:21 201512 // Last Modified On : Thu Apr 14 12:04:58 2016 13 13 // Update Count : 19 14 14 // … … 22 22 #include "Mutator.h" 23 23 #include "Constant.h" 24 #include "Common/UniqueName.h" 24 25 25 26 /// Expression is the root type for all expressions … … 539 540 }; 540 541 542 /// ImplicitCopyCtorExpr represents the application of a function to a set of parameters, 543 /// along with a set of copy constructor calls, one for each argument. 544 class ImplicitCopyCtorExpr : public Expression { 545 public: 546 ImplicitCopyCtorExpr( ApplicationExpr * callExpr ); 547 ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other ); 548 virtual ~ImplicitCopyCtorExpr(); 549 550 ApplicationExpr *get_callExpr() const { return callExpr; } 551 void set_callExpr( ApplicationExpr *newValue ) { callExpr = newValue; } 552 553 std::list< Expression * > & get_copyCtors() { return copyCtors; } 554 void set_copyCtors( std::list< Expression * > newValue ) { copyCtors = newValue; } 555 556 std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; } 557 void set_tempDecls( std::list< ObjectDecl * > newValue ) { tempDecls = newValue; } 558 559 std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; } 560 void set_returnDecls( std::list< ObjectDecl * > newValue ) { returnDecls = newValue; } 561 562 std::list< Expression * > & get_dtors() { return dtors; } 563 void set_dtors( std::list< Expression * > newValue ) { dtors = newValue; } 564 565 virtual ImplicitCopyCtorExpr *clone() const { return new ImplicitCopyCtorExpr( *this ); } 566 virtual void accept( Visitor &v ) { v.visit( this ); } 567 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 568 virtual void print( std::ostream &os, int indent = 0 ) const; 569 private: 570 ApplicationExpr * callExpr; 571 std::list< Expression * > copyCtors; 572 std::list< ObjectDecl * > tempDecls; 573 std::list< ObjectDecl * > returnDecls; 574 std::list< Expression * > dtors; 575 }; 576 541 577 /// ValofExpr represents a GCC 'lambda expression' 542 578 class UntypedValofExpr : public Expression { -
src/SynTree/Initializer.h
r7eabc25 rdb4ecc5 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 11 17:35:30201612 // Last Modified On : Tue Apr 12 13:49:13 2016 13 13 // Update Count : 19 14 14 // … … 58 58 class SingleInit : public Initializer { 59 59 public: 60 SingleInit( Expression *value, const std::list< Expression *> &designators , bool maybeConstructed = false );60 SingleInit( Expression *value, const std::list< Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false ); 61 61 SingleInit( const SingleInit &other ); 62 62 virtual ~SingleInit(); … … 83 83 public: 84 84 ListInit( const std::list<Initializer*> &initializers, 85 const std::list<Expression *> &designators , bool maybeConstructed = false );85 const std::list<Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false ); 86 86 virtual ~ListInit(); 87 87 -
src/SynTree/Mutator.cc
r7eabc25 rdb4ecc5 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 04 17:14:20201612 // Last Modified On : Fri Apr 08 14:01:47 2016 13 13 // Update Count : 15 14 14 // … … 331 331 } 332 332 333 Expression* Mutator::mutate( ImplicitCopyCtorExpr *impCpCtorExpr ) { 334 impCpCtorExpr->set_callExpr( maybeMutate( impCpCtorExpr->get_callExpr(), *this ) ); 335 mutateAll( impCpCtorExpr->get_copyCtors(), *this ); 336 mutateAll( impCpCtorExpr->get_tempDecls(), *this ); 337 return impCpCtorExpr; 338 } 339 333 340 Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) { 334 341 mutateAll( valofExpr->get_results(), *this ); -
src/SynTree/Mutator.h
r7eabc25 rdb4ecc5 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 04 17:14:44 201612 // Last Modified On : Fri Apr 08 13:22:04 2016 13 13 // Update Count : 9 14 14 // … … 75 75 virtual Expression* mutate( TypeExpr *typeExpr ); 76 76 virtual Expression* mutate( AsmExpr *asmExpr ); 77 virtual Expression* mutate( ImplicitCopyCtorExpr *impCpCtorExpr ); 77 78 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 78 79 -
src/SynTree/SynTree.h
r7eabc25 rdb4ecc5 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 04 17:16:09201612 // Last Modified On : Fri Apr 08 13:49:47 2016 13 13 // Update Count : 4 14 14 // … … 80 80 class TypeExpr; 81 81 class AsmExpr; 82 class ImplicitCopyCtorExpr; 82 83 class UntypedValofExpr; 83 84 -
src/SynTree/Visitor.cc
r7eabc25 rdb4ecc5 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 04 17:16:25201612 // Last Modified On : Fri Apr 08 13:53:21 2016 13 13 // Update Count : 18 14 14 // … … 279 279 } 280 280 281 void Visitor::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) { 282 maybeAccept( impCpCtorExpr->get_callExpr(), *this ); 283 acceptAll( impCpCtorExpr->get_copyCtors(), *this ); 284 acceptAll( impCpCtorExpr->get_tempDecls(), *this ); 285 } 286 281 287 void Visitor::visit( UntypedValofExpr *valofExpr ) { 282 288 acceptAll( valofExpr->get_results(), *this ); -
src/SynTree/Visitor.h
r7eabc25 rdb4ecc5 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 04 17:16:36201612 // Last Modified On : Fri Apr 08 13:26:31 2016 13 13 // Update Count : 6 14 14 // … … 75 75 virtual void visit( TypeExpr *typeExpr ); 76 76 virtual void visit( AsmExpr *asmExpr ); 77 virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr ); 77 78 virtual void visit( UntypedValofExpr *valofExpr ); 78 79
Note: See TracChangeset
for help on using the changeset viewer.