Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/FixInit.cc

    r092528b r627f585  
    2121#include <unordered_set>
    2222#include "InitTweak.h"
    23 #include "GenInit.h"
    2423#include "FixInit.h"
    2524#include "FixGlobalInit.h"
     
    8786                        /// create and resolve ctor/dtor expression: fname(var, [cpArg])
    8887                        Expression * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL );
     88                        Expression * makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg = NULL );
    8989                        /// true if type does not need to be copy constructed to ensure correctness
    9090                        bool skipCopyConstruct( Type * type );
    9191                        void copyConstructArg( Expression *& arg, ImplicitCopyCtorExpr * impCpCtorExpr );
    92                         void destructRet( ObjectDecl * ret, ImplicitCopyCtorExpr * impCpCtorExpr );
     92                        void destructRet( Expression * ret, ImplicitCopyCtorExpr * impCpCtorExpr );
    9393
    9494                        TypeSubstitution * env;
     
    398398                Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) {
    399399                        assert( var );
    400                         // arrays are not copy constructed, so this should always be an ExprStmt
    401                         ImplicitCtorDtorStmt * stmt = genCtorDtor( fname, var, cpArg );
    402                         ExprStmt * exprStmt = safe_dynamic_cast< ExprStmt * >( stmt->get_callStmt() );
    403                         Expression * untyped = exprStmt->get_expr();
     400                        return makeCtorDtor( fname, new AddressExpr( new VariableExpr( var ) ), cpArg );
     401                }
     402
     403                Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg ) {
     404                        assert( thisArg );
     405                        UntypedExpr * untyped = new UntypedExpr( new NameExpr( fname ) );
     406                        untyped->get_args().push_back( thisArg );
     407                        if (cpArg) untyped->get_args().push_back( cpArg->clone() );
    404408
    405409                        // resolve copy constructor
     
    416420                        } // if
    417421
    418                         delete stmt;
     422                        delete untyped;
    419423                        return resolved;
    420424                }
     
    452456                }
    453457
    454                 void ResolveCopyCtors::destructRet( ObjectDecl * ret, ImplicitCopyCtorExpr * impCpCtorExpr ) {
    455                         impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", ret ) );
     458                void ResolveCopyCtors::destructRet( Expression * ret, ImplicitCopyCtorExpr * impCpCtorExpr ) {
     459                        impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", new AddressExpr( ret ) ) );
    456460                }
    457461
     
    483487                                if ( ! result->get_isLvalue() ) {
    484488                                        // destructing lvalue returns is bad because it can cause multiple destructor calls to the same object - the returned object is not a temporary
    485                                         destructRet( ret, impCpCtorExpr );
     489                                        destructRet( new VariableExpr( ret ), impCpCtorExpr );
    486490                                }
    487491                        } // for
     
    511515                                last->set_expr( makeCtorDtor( "?{}", ret, last->get_expr() ) );
    512516
    513                                 stmtExpr->get_dtors().push_front( makeCtorDtor( "^?{}", ret ) );
     517                                stmtExpr->get_dtors().push_front( makeCtorDtor( "^?{}", new AddressExpr( new VariableExpr( ret ) ) ) );
    514518                        } // if
    515519
Note: See TracChangeset for help on using the changeset viewer.