Changes in src/InitTweak/FixInit.cc [edbdbe6:a4dd728]
- File:
-
- 1 edited
-
src/InitTweak/FixInit.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/FixInit.cc
redbdbe6 ra4dd728 361 361 FunctionType * ftype = dynamic_cast< FunctionType * >( GenPoly::getFunctionType( funcDecl->get_type() ) ); 362 362 assert( ftype ); 363 if ( isConstructor( funcDecl->get_name()) && ftype->get_parameters().size() == 2 ) {363 if ( (isConstructor( funcDecl->get_name() ) || funcDecl->get_name() == "?=?") && ftype->get_parameters().size() == 2 ) { 364 364 Type * t1 = ftype->get_parameters().front()->get_type(); 365 365 Type * t2 = ftype->get_parameters().back()->get_type(); … … 367 367 368 368 if ( ResolvExpr::typesCompatible( ptrType->get_base(), t2, SymTab::Indexer() ) ) { 369 // optimization: don't need to copy construct in order to call a copy constructor 369 // optimization: don't need to copy construct in order to call a copy constructor or 370 // assignment operator 370 371 return appExpr; 371 372 } // if … … 635 636 assert( ! stmtExpr->get_returnDecls().empty() ); 636 637 body->get_kids().push_back( new ExprStmt( noLabels, new VariableExpr( stmtExpr->get_returnDecls().front() ) ) ); 637 stmtExpr->get_returnDecls().clear(); 638 stmtExpr->get_dtors().clear(); 639 } 640 assert( stmtExpr->get_returnDecls().empty() ); 641 assert( stmtExpr->get_dtors().empty() ); 638 } 639 stmtExpr->get_returnDecls().clear(); 640 stmtExpr->get_dtors().clear(); 642 641 return stmtExpr; 643 642 } … … 656 655 unqExpr->set_result( maybeClone( unqExpr->get_expr()->get_result() ) ); 657 656 if ( unqCount[ unqExpr->get_id() ] == 0 ) { // insert destructor after the last use of the unique expression 658 stmtsToAdd After.splice( stmtsToAddAfter.end(), dtors[ unqExpr->get_id() ] );657 stmtsToAdd.splice( stmtsToAddAfter.end(), dtors[ unqExpr->get_id() ] ); 659 658 } 660 659 if ( addDeref.count( unqExpr->get_id() ) ) { … … 668 667 stmtsToAdd.splice( stmtsToAdd.end(), fixer.stmtsToAdd ); 669 668 unqMap[unqExpr->get_id()] = unqExpr; 670 if ( unqCount[ unqExpr->get_id() ] == 0 ) { // insert destructor after the last use of the unique expression671 stmtsToAddAfter.splice( stmtsToAddAfter.end(), dtors[ unqExpr->get_id() ] );672 } else { // remember dtors for last instance of unique expr673 dtors[ unqExpr->get_id() ] = fixer.stmtsToAddAfter;674 }675 669 if ( UntypedExpr * deref = dynamic_cast< UntypedExpr * >( unqExpr->get_expr() ) ) { 676 670 // unique expression is now a dereference, because the inner expression is an lvalue returning function call. … … 681 675 getCallArg( deref, 0 ) = unqExpr; 682 676 addDeref.insert( unqExpr->get_id() ); 677 if ( unqCount[ unqExpr->get_id() ] == 0 ) { // insert destructor after the last use of the unique expression 678 stmtsToAdd.splice( stmtsToAddAfter.end(), dtors[ unqExpr->get_id() ] ); 679 } else { // remember dtors for last instance of unique expr 680 dtors[ unqExpr->get_id() ] = fixer.stmtsToAddAfter; 681 } 683 682 return deref; 684 683 }
Note:
See TracChangeset
for help on using the changeset viewer.