Changes in / [4563a95:119745e]
- Location:
- src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/InitTweak.cc
r4563a95 r119745e 304 304 305 305 namespace { 306 DeclarationWithType * getCalledFunction( Expression * expr ) { 307 assert( expr ); 308 if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( expr ) ) { 309 return varExpr->get_var(); 310 } else if ( MemberExpr * memberExpr = dynamic_cast< MemberExpr * >( expr ) ) { 311 return memberExpr->get_member(); 312 } else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) { 313 return getCalledFunction( castExpr->get_arg() ); 314 } 315 return nullptr; 306 VariableExpr * getCalledFunction( ApplicationExpr * appExpr ) { 307 assert( appExpr ); 308 // xxx - it's possible this can be other things, e.g. MemberExpr, so this is insufficient 309 return dynamic_cast< VariableExpr * >( appExpr->get_function() ); 316 310 } 317 311 } … … 320 314 ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr ); 321 315 if ( ! appExpr ) return NULL; 322 DeclarationWithType * function = getCalledFunction( appExpr->get_function());316 VariableExpr * function = getCalledFunction( appExpr ); 323 317 assert( function ); 324 318 // check for Intrinsic only - don't want to remove all overridable ctor/dtors because autogenerated ctor/dtor 325 319 // will call all member dtors, and some members may have a user defined dtor. 326 return function->get_ linkage() == LinkageSpec::Intrinsic ? appExpr : NULL;320 return function->get_var()->get_linkage() == LinkageSpec::Intrinsic ? appExpr : NULL; 327 321 } 328 322 … … 385 379 } else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( func ) ) { 386 380 return funcName( castExpr->get_arg() ); 387 } else if ( MemberExpr * memberExpr = dynamic_cast< MemberExpr * >( func ) ) {388 return memberExpr->get_member()->get_name();389 381 } else { 390 382 assert( false && "Unexpected expression type being called as a function in call expression" ); … … 480 472 bool isConstructor( const std::string & str ) { return str == "?{}"; } 481 473 bool isDestructor( const std::string & str ) { return str == "^?{}"; } 482 bool isAssignment( const std::string & str ) { return str == "?=?"; }483 474 bool isCtorDtor( const std::string & str ) { return isConstructor( str ) || isDestructor( str ); } 484 bool isCtorDtorAssign( const std::string & str ) { return isCtorDtor( str ) || isAssignment( str ); } 485 486 FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname ) { 475 476 FunctionDecl * isCopyConstructor( Declaration * decl ) { 487 477 FunctionDecl * function = dynamic_cast< FunctionDecl * >( decl ); 488 478 if ( ! function ) return 0; 489 if ( function->get_name() != fname) return 0;479 if ( ! isConstructor( function->get_name() ) ) return 0; 490 480 FunctionType * ftype = function->get_functionType(); 491 481 if ( ftype->get_parameters().size() != 2 ) return 0; … … 496 486 assert( ptrType ); 497 487 498 if ( ResolvExpr::typesCompatible IgnoreQualifiers( ptrType->get_base(), t2, SymTab::Indexer() ) ) {488 if ( ResolvExpr::typesCompatible( ptrType->get_base(), t2, SymTab::Indexer() ) ) { 499 489 return function; 500 490 } else { 501 return nullptr; 502 } 503 } 504 505 FunctionDecl * isCopyConstructor( Declaration * decl ) { 506 return isCopyFunction( decl, "?{}" ); 491 return 0; 492 } 507 493 } 508 494 } -
src/InitTweak/InitTweak.h
r4563a95 r119745e 28 28 bool isConstructor( const std::string & ); 29 29 bool isDestructor( const std::string & ); 30 bool isAssignment( const std::string & );31 30 bool isCtorDtor( const std::string & ); 32 bool isCtorDtorAssign( const std::string & );33 31 34 32 FunctionDecl * isCopyConstructor( Declaration * decl ); 35 FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname );36 33 37 34 /// transform Initializer into an argument list that can be passed to a call expression -
src/SymTab/Indexer.cc
r4563a95 r119745e 105 105 106 106 void Indexer::removeSpecialOverrides( const std::string &id, std::list< DeclarationWithType * > & out ) const { 107 // only need to perform this step for constructors , destructors, and assignment functions108 if ( ! InitTweak::isCtorDtor Assign( id ) ) return;107 // only need to perform this step for constructors and destructors 108 if ( ! InitTweak::isCtorDtor( id ) ) return; 109 109 110 110 // helpful data structure … … 127 127 bool isUserDefinedFunc = ! LinkageSpec::isOverridable( function->get_linkage() ); 128 128 bool isDefaultFunc = function->get_functionType()->get_parameters().size() == 1; 129 bool isCopyFunc = InitTweak::isCopy Function( function, function->get_name());129 bool isCopyFunc = InitTweak::isCopyConstructor( function ); 130 130 decls.push_back( DeclBall{ function, isUserDefinedFunc, isDefaultFunc, isCopyFunc } ); 131 131 userDefinedFunc = userDefinedFunc || isUserDefinedFunc;
Note: See TracChangeset
for help on using the changeset viewer.