Changeset ee1635c8


Ignore:
Timestamp:
Sep 8, 2016, 4:49:57 PM (6 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
4563a95
Parents:
24670d2
Message:

automatically hide generated assignment functions following the same rules as ctor/dtors

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/InitTweak.cc

    r24670d2 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}
  • src/InitTweak/InitTweak.h

    r24670d2 ree1635c8  
    2828        bool isConstructor( const std::string & );
    2929        bool isDestructor( const std::string & );
     30        bool isAssignment( const std::string & );
    3031        bool isCtorDtor( const std::string & );
     32        bool isCtorDtorAssign( const std::string & );
    3133
    3234        FunctionDecl * isCopyConstructor( Declaration * decl );
     35        FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname );
    3336
    3437        /// transform Initializer into an argument list that can be passed to a call expression
  • src/SymTab/Indexer.cc

    r24670d2 ree1635c8  
    105105
    106106        void Indexer::removeSpecialOverrides( const std::string &id, std::list< DeclarationWithType * > & out ) const {
    107                 // only need to perform this step for constructors and destructors
    108                 if ( ! InitTweak::isCtorDtor( id ) ) return;
     107                // only need to perform this step for constructors, destructors, and assignment functions
     108                if ( ! InitTweak::isCtorDtorAssign( id ) ) return;
    109109
    110110                // helpful data structure
     
    127127                                bool isUserDefinedFunc = ! LinkageSpec::isOverridable( function->get_linkage() );
    128128                                bool isDefaultFunc = function->get_functionType()->get_parameters().size() == 1;
    129                                 bool isCopyFunc = InitTweak::isCopyConstructor( function );
     129                                bool isCopyFunc = InitTweak::isCopyFunction( function, function->get_name() );
    130130                                decls.push_back( DeclBall{ function, isUserDefinedFunc, isDefaultFunc, isCopyFunc } );
    131131                                userDefinedFunc = userDefinedFunc || isUserDefinedFunc;
Note: See TracChangeset for help on using the changeset viewer.