- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
r9e23b446 r09f34a84 41 41 #include "Common/utility.h" // for move, copy 42 42 #include "SymTab/Mangler.h" 43 #include "SymTab/Validate.h" // for validateType44 43 #include "Tuples/Tuples.h" // for handleTupleAssignment 45 44 #include "InitTweak/InitTweak.h" // for getPointerBase … … 270 269 unsigned nextArg, unsigned tupleStart = 0, Cost cost = Cost::zero, 271 270 unsigned nextExpl = 0, unsigned explAlt = 0 ) 272 : parent(parent), expr( expr ), cost( cost ), env( move( env ) ), need(move( need ) ),273 have( move( have ) ), open(move( open ) ), nextArg( nextArg ), tupleStart( tupleStart ),271 : parent(parent), expr( expr ), cost( cost ), env( std::move( env ) ), need( std::move( need ) ), 272 have( std::move( have ) ), open( std::move( open ) ), nextArg( nextArg ), tupleStart( tupleStart ), 274 273 nextExpl( nextExpl ), explAlt( explAlt ) {} 275 274 … … 277 276 const ArgPack & o, ast::TypeEnvironment && env, ast::AssertionSet && need, 278 277 ast::AssertionSet && have, ast::OpenVarSet && open, unsigned nextArg, Cost added ) 279 : parent( o.parent ), expr( o.expr ), cost( o.cost + added ), env( move( env ) ),280 need( move( need ) ), have( move( have ) ), open(move( open ) ), nextArg( nextArg ),278 : parent( o.parent ), expr( o.expr ), cost( o.cost + added ), env( std::move( env ) ), 279 need( std::move( need ) ), have( std::move( have ) ), open( std::move( open ) ), nextArg( nextArg ), 281 280 tupleStart( o.tupleStart ), nextExpl( 0 ), explAlt( 0 ) {} 282 281 … … 302 301 // reset pack to appropriate tuple 303 302 std::vector< ast::ptr< ast::Expr > > exprv( exprs.begin(), exprs.end() ); 304 expr = new ast::TupleExpr{ expr->location, move( exprv ) };303 expr = new ast::TupleExpr{ expr->location, std::move( exprv ) }; 305 304 tupleStart = pack->tupleStart - 1; 306 305 parent = pack->parent; … … 405 404 newResult.open, symtab ) 406 405 ) { 407 finalResults.emplace_back( move( newResult ) );406 finalResults.emplace_back( std::move( newResult ) ); 408 407 } 409 408 … … 424 423 if ( expl.exprs.empty() ) { 425 424 results.emplace_back( 426 results[i], move( env ), copy( results[i].need ),427 copy( results[i].have ), move( open ), nextArg + 1, expl.cost );425 results[i], std::move( env ), copy( results[i].need ), 426 copy( results[i].have ), std::move( open ), nextArg + 1, expl.cost ); 428 427 429 428 continue; … … 432 431 // add new result 433 432 results.emplace_back( 434 i, expl.exprs.front(), move( env ), copy( results[i].need ),435 copy( results[i].have ), move( open ), nextArg + 1, nTuples,433 i, expl.exprs.front(), std::move( env ), copy( results[i].need ), 434 copy( results[i].have ), std::move( open ), nextArg + 1, nTuples, 436 435 expl.cost, expl.exprs.size() == 1 ? 0 : 1, j ); 437 436 } … … 445 444 // splice final results onto results 446 445 for ( std::size_t i = 0; i < finalResults.size(); ++i ) { 447 results.emplace_back( move( finalResults[i] ) );446 results.emplace_back( std::move( finalResults[i] ) ); 448 447 } 449 448 return ! finalResults.empty(); … … 479 478 480 479 results.emplace_back( 481 i, expr, move( env ), move( need ), move( have ),move( open ), nextArg,480 i, expr, std::move( env ), std::move( need ), std::move( have ), std::move( open ), nextArg, 482 481 nTuples, Cost::zero, nextExpl, results[i].explAlt ); 483 482 } … … 495 494 if ( unify( paramType, cnst->result, env, need, have, open, symtab ) ) { 496 495 results.emplace_back( 497 i, new ast::DefaultArgExpr{ cnst->location, cnst }, move( env ),498 move( need ), move( have ),move( open ), nextArg, nTuples );496 i, new ast::DefaultArgExpr{ cnst->location, cnst }, std::move( env ), 497 std::move( need ), std::move( have ), std::move( open ), nextArg, nTuples ); 499 498 } 500 499 } … … 517 516 if ( expl.exprs.empty() ) { 518 517 results.emplace_back( 519 results[i], move( env ), move( need ), move( have ),move( open ),518 results[i], std::move( env ), std::move( need ), std::move( have ), std::move( open ), 520 519 nextArg + 1, expl.cost ); 521 520 … … 539 538 // add new result 540 539 results.emplace_back( 541 i, expr, move( env ), move( need ), move( have ),move( open ),540 i, expr, std::move( env ), std::move( need ), std::move( have ), std::move( open ), 542 541 nextArg + 1, nTuples, expl.cost, expl.exprs.size() == 1 ? 0 : 1, j ); 543 542 } … … 577 576 restructureCast( idx, toType->getComponent( i ), isGenerated ) ); 578 577 } 579 return new ast::TupleExpr{ arg->location, move( components ) };578 return new ast::TupleExpr{ arg->location, std::move( components ) }; 580 579 } else { 581 580 // handle normally … … 673 672 } 674 673 std::vector< ast::ptr< ast::Expr > > vargs( args.begin(), args.end() ); 675 appExpr->args = move( vargs );674 appExpr->args = std::move( vargs ); 676 675 // build and validate new candidate 677 676 auto newCand = … … 784 783 if ( expl.exprs.empty() ) { 785 784 results.emplace_back( 786 results[i], move( env ), copy( results[i].need ),787 copy( results[i].have ), move( open ), nextArg + 1,785 results[i], std::move( env ), copy( results[i].need ), 786 copy( results[i].have ), std::move( open ), nextArg + 1, 788 787 expl.cost ); 789 788 … … 793 792 // add new result 794 793 results.emplace_back( 795 i, expl.exprs.front(), move( env ), copy( results[i].need ),796 copy( results[i].have ), move( open ), nextArg + 1, 0, expl.cost,794 i, expl.exprs.front(), std::move( env ), copy( results[i].need ), 795 copy( results[i].have ), std::move( open ), nextArg + 1, 0, expl.cost, 797 796 expl.exprs.size() == 1 ? 0 : 1, j ); 798 797 } … … 844 843 // as a member expression 845 844 addAnonConversions( newCand ); 846 candidates.emplace_back( move( newCand ) );845 candidates.emplace_back( std::move( newCand ) ); 847 846 } 848 847 } … … 902 901 const ast::EnumDecl * enumDecl = enumInst->base; 903 902 if ( const ast::Type* enumType = enumDecl->base ) { 904 // instance of enum (T) is a instance of type (T) 903 // instance of enum (T) is a instance of type (T) 905 904 funcFinder.otypeKeys.insert(Mangle::mangle(enumType, Mangle::NoGenericParams | Mangle::Type)); 906 905 } else { … … 908 907 funcFinder.otypeKeys.insert(Mangle::mangle(enumDecl, Mangle::NoGenericParams | Mangle::Type)); 909 908 } 910 } 909 } 911 910 else funcFinder.otypeKeys.insert(Mangle::mangle(argType, Mangle::NoGenericParams | Mangle::Type)); 912 911 } … … 987 986 funcE.emplace_back( *func, symtab ); 988 987 } 989 argExpansions.emplace_front( move( funcE ) );988 argExpansions.emplace_front( std::move( funcE ) ); 990 989 991 990 for ( const CandidateRef & op : opFinder ) { … … 1031 1030 if ( cvtCost != Cost::infinity ) { 1032 1031 withFunc->cvtCost = cvtCost; 1033 candidates.emplace_back( move( withFunc ) );1034 } 1035 } 1036 found = move( candidates );1032 candidates.emplace_back( std::move( withFunc ) ); 1033 } 1034 } 1035 found = std::move( candidates ); 1037 1036 1038 1037 // use a new list so that candidates are not examined by addAnonConversions twice … … 1091 1090 assert( toType ); 1092 1091 toType = resolveTypeof( toType, context ); 1093 // toType = SymTab::validateType( castExpr->location, toType, symtab );1094 1092 toType = adjustExprType( toType, tenv, symtab ); 1095 1093 … … 1133 1131 CandidateRef newCand = std::make_shared<Candidate>( 1134 1132 restructureCast( cand->expr, toType, castExpr->isGenerated ), 1135 copy( cand->env ), move( open ),move( need ), cand->cost,1133 copy( cand->env ), std::move( open ), std::move( need ), cand->cost, 1136 1134 cand->cost + thisCost ); 1137 1135 inferParameters( newCand, matches ); … … 1287 1285 // as a name expression 1288 1286 addAnonConversions( newCand ); 1289 candidates.emplace_back( move( newCand ) );1287 candidates.emplace_back( std::move( newCand ) ); 1290 1288 } 1291 1289 } … … 1396 1394 new ast::LogicalExpr{ 1397 1395 logicalExpr->location, r1->expr, r2->expr, logicalExpr->isAnd }, 1398 move( env ), move( open ),move( need ), r1->cost + r2->cost );1396 std::move( env ), std::move( open ), std::move( need ), r1->cost + r2->cost ); 1399 1397 } 1400 1398 } … … 1454 1452 // output candidate 1455 1453 CandidateRef newCand = std::make_shared<Candidate>( 1456 newExpr, move( env ), move( open ),move( need ), cost );1454 newExpr, std::move( env ), std::move( open ), std::move( need ), cost ); 1457 1455 inferParameters( newCand, candidates ); 1458 1456 } … … 1521 1519 // add candidate 1522 1520 CandidateRef newCand = std::make_shared<Candidate>( 1523 newExpr, move( env ), move( open ),move( need ),1521 newExpr, std::move( env ), std::move( open ), std::move( need ), 1524 1522 r1->cost + r2->cost ); 1525 1523 inferParameters( newCand, candidates ); … … 1550 1548 1551 1549 addCandidate( 1552 new ast::TupleExpr{ tupleExpr->location, move( exprs ) },1553 move( env ), move( open ),move( need ), sumCost( subs ) );1550 new ast::TupleExpr{ tupleExpr->location, std::move( exprs ) }, 1551 std::move( env ), std::move( open ), std::move( need ), sumCost( subs ) ); 1554 1552 } 1555 1553 } … … 1590 1588 // calculate target type 1591 1589 const ast::Type * toType = resolveTypeof( initAlt.type, context ); 1592 // toType = SymTab::validateType( initExpr->location, toType, symtab );1593 1590 toType = adjustExprType( toType, tenv, symtab ); 1594 1591 // The call to find must occur inside this loop, otherwise polymorphic return … … 1638 1635 initExpr->location, restructureCast( cand->expr, toType ), 1639 1636 initAlt.designation }, 1640 move(env), move( open ),move( need ), cand->cost, thisCost );1637 std::move(env), std::move( open ), std::move( need ), cand->cost, thisCost ); 1641 1638 inferParameters( newCand, matches ); 1642 1639 } … … 1771 1768 cand->env.applyFree( newResult ); 1772 1769 cand->expr = ast::mutate_field( 1773 cand->expr.get(), &ast::Expr::result, move( newResult ) );1770 cand->expr.get(), &ast::Expr::result, std::move( newResult ) ); 1774 1771 1775 1772 out.emplace_back( cand ); … … 1857 1854 1858 1855 auto oldsize = candidates.size(); 1859 candidates = move( pruned );1856 candidates = std::move( pruned ); 1860 1857 1861 1858 PRINT(
Note:
See TracChangeset
for help on using the changeset viewer.