Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/InitTweak.cc

    rdcd73d1 ree1635c8  
    304304
    305305        namespace {
    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() );
     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;
    310316                }
    311317        }
     
    314320                ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr );
    315321                if ( ! appExpr ) return NULL;
    316                 VariableExpr * function = getCalledFunction( appExpr );
     322                DeclarationWithType * function = getCalledFunction( appExpr->get_function() );
    317323                assert( function );
    318324                // check for Intrinsic only - don't want to remove all overridable ctor/dtors because autogenerated ctor/dtor
    319325                // will call all member dtors, and some members may have a user defined dtor.
    320                 return function->get_var()->get_linkage() == LinkageSpec::Intrinsic ? appExpr : NULL;
     326                return function->get_linkage() == LinkageSpec::Intrinsic ? appExpr : NULL;
    321327        }
    322328
     
    379385                        }       else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( func ) ) {
    380386                                return funcName( castExpr->get_arg() );
     387                        } else if ( MemberExpr * memberExpr = dynamic_cast< MemberExpr * >( func ) ) {
     388                                return memberExpr->get_member()->get_name();
    381389                        } else {
    382390                                assert( false && "Unexpected expression type being called as a function in call expression" );
     
    472480        bool isConstructor( const std::string & str ) { return str == "?{}"; }
    473481        bool isDestructor( const std::string & str ) { return str == "^?{}"; }
     482        bool isAssignment( const std::string & str ) { return str == "?=?"; }
    474483        bool isCtorDtor( const std::string & str ) { return isConstructor( str ) || isDestructor( str ); }
    475 
    476         FunctionDecl * isCopyConstructor( Declaration * decl ) {
     484        bool isCtorDtorAssign( const std::string & str ) { return isCtorDtor( str ) || isAssignment( str ); }
     485
     486        FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname ) {
    477487                FunctionDecl * function = dynamic_cast< FunctionDecl * >( decl );
    478488                if ( ! function ) return 0;
    479                 if ( ! isConstructor( function->get_name() ) ) return 0;
     489                if ( function->get_name() != fname ) return 0;
    480490                FunctionType * ftype = function->get_functionType();
    481491                if ( ftype->get_parameters().size() != 2 ) return 0;
     
    486496                assert( ptrType );
    487497
    488                 if ( ResolvExpr::typesCompatible( ptrType->get_base(), t2, SymTab::Indexer() ) ) {
     498                if ( ResolvExpr::typesCompatibleIgnoreQualifiers( ptrType->get_base(), t2, SymTab::Indexer() ) ) {
    489499                        return function;
    490500                } else {
    491                         return 0;
    492                 }
     501                        return nullptr;
     502                }
     503        }
     504
     505        FunctionDecl * isCopyConstructor( Declaration * decl ) {
     506                return isCopyFunction( decl, "?{}" );
    493507        }
    494508}
Note: See TracChangeset for help on using the changeset viewer.