Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CandidateFinder.cpp

    r09f34a84 r9e23b446  
    4141#include "Common/utility.h"       // for move, copy
    4242#include "SymTab/Mangler.h"
     43#include "SymTab/Validate.h"      // for validateType
    4344#include "Tuples/Tuples.h"        // for handleTupleAssignment
    4445#include "InitTweak/InitTweak.h"  // for getPointerBase
     
    269270                        unsigned nextArg, unsigned tupleStart = 0, Cost cost = Cost::zero,
    270271                        unsigned nextExpl = 0, unsigned explAlt = 0 )
    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 ),
     272                : parent(parent), expr( expr ), cost( cost ), env( move( env ) ), need( move( need ) ),
     273                  have( move( have ) ), open( move( open ) ), nextArg( nextArg ), tupleStart( tupleStart ),
    273274                  nextExpl( nextExpl ), explAlt( explAlt ) {}
    274275
     
    276277                        const ArgPack & o, ast::TypeEnvironment && env, ast::AssertionSet && need,
    277278                        ast::AssertionSet && have, ast::OpenVarSet && open, unsigned nextArg, Cost added )
    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 ),
     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 ),
    280281                  tupleStart( o.tupleStart ), nextExpl( 0 ), explAlt( 0 ) {}
    281282
     
    301302                        // reset pack to appropriate tuple
    302303                        std::vector< ast::ptr< ast::Expr > > exprv( exprs.begin(), exprs.end() );
    303                         expr = new ast::TupleExpr{ expr->location, std::move( exprv ) };
     304                        expr = new ast::TupleExpr{ expr->location, move( exprv ) };
    304305                        tupleStart = pack->tupleStart - 1;
    305306                        parent = pack->parent;
     
    404405                                                                newResult.open, symtab )
    405406                                                ) {
    406                                                         finalResults.emplace_back( std::move( newResult ) );
     407                                                        finalResults.emplace_back( move( newResult ) );
    407408                                                }
    408409
     
    423424                                                if ( expl.exprs.empty() ) {
    424425                                                        results.emplace_back(
    425                                                                 results[i], std::move( env ), copy( results[i].need ),
    426                                                                 copy( results[i].have ), std::move( open ), nextArg + 1, expl.cost );
     426                                                                results[i], move( env ), copy( results[i].need ),
     427                                                                copy( results[i].have ), move( open ), nextArg + 1, expl.cost );
    427428
    428429                                                        continue;
     
    431432                                                // add new result
    432433                                                results.emplace_back(
    433                                                         i, expl.exprs.front(), std::move( env ), copy( results[i].need ),
    434                                                         copy( results[i].have ), std::move( open ), nextArg + 1, nTuples,
     434                                                        i, expl.exprs.front(), move( env ), copy( results[i].need ),
     435                                                        copy( results[i].have ), move( open ), nextArg + 1, nTuples,
    435436                                                        expl.cost, expl.exprs.size() == 1 ? 0 : 1, j );
    436437                                        }
     
    444445                        // splice final results onto results
    445446                        for ( std::size_t i = 0; i < finalResults.size(); ++i ) {
    446                                 results.emplace_back( std::move( finalResults[i] ) );
     447                                results.emplace_back( move( finalResults[i] ) );
    447448                        }
    448449                        return ! finalResults.empty();
     
    478479
    479480                                        results.emplace_back(
    480                                                 i, expr, std::move( env ), std::move( need ), std::move( have ), std::move( open ), nextArg,
     481                                                i, expr, move( env ), move( need ), move( have ), move( open ), nextArg,
    481482                                                nTuples, Cost::zero, nextExpl, results[i].explAlt );
    482483                                }
     
    494495                                        if ( unify( paramType, cnst->result, env, need, have, open, symtab ) ) {
    495496                                                results.emplace_back(
    496                                                         i, new ast::DefaultArgExpr{ cnst->location, cnst }, std::move( env ),
    497                                                         std::move( need ), std::move( have ), std::move( open ), nextArg, nTuples );
     497                                                        i, new ast::DefaultArgExpr{ cnst->location, cnst }, move( env ),
     498                                                        move( need ), move( have ), move( open ), nextArg, nTuples );
    498499                                        }
    499500                                }
     
    516517                                if ( expl.exprs.empty() ) {
    517518                                        results.emplace_back(
    518                                                 results[i], std::move( env ), std::move( need ), std::move( have ), std::move( open ),
     519                                                results[i], move( env ), move( need ), move( have ), move( open ),
    519520                                                nextArg + 1, expl.cost );
    520521
     
    538539                                        // add new result
    539540                                        results.emplace_back(
    540                                                 i, expr, std::move( env ), std::move( need ), std::move( have ), std::move( open ),
     541                                                i, expr, move( env ), move( need ), move( have ), move( open ),
    541542                                                nextArg + 1, nTuples, expl.cost, expl.exprs.size() == 1 ? 0 : 1, j );
    542543                                }
     
    576577                                        restructureCast( idx, toType->getComponent( i ), isGenerated ) );
    577578                        }
    578                         return new ast::TupleExpr{ arg->location, std::move( components ) };
     579                        return new ast::TupleExpr{ arg->location, move( components ) };
    579580                } else {
    580581                        // handle normally
     
    672673                        }
    673674                        std::vector< ast::ptr< ast::Expr > > vargs( args.begin(), args.end() );
    674                         appExpr->args = std::move( vargs );
     675                        appExpr->args = move( vargs );
    675676                        // build and validate new candidate
    676677                        auto newCand =
     
    783784                                                        if ( expl.exprs.empty() ) {
    784785                                                                results.emplace_back(
    785                                                                         results[i], std::move( env ), copy( results[i].need ),
    786                                                                         copy( results[i].have ), std::move( open ), nextArg + 1,
     786                                                                        results[i], move( env ), copy( results[i].need ),
     787                                                                        copy( results[i].have ), move( open ), nextArg + 1,
    787788                                                                        expl.cost );
    788789
     
    792793                                                        // add new result
    793794                                                        results.emplace_back(
    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,
     795                                                                i, expl.exprs.front(), move( env ), copy( results[i].need ),
     796                                                                copy( results[i].have ), move( open ), nextArg + 1, 0, expl.cost,
    796797                                                                expl.exprs.size() == 1 ? 0 : 1, j );
    797798                                                }
     
    843844                                // as a member expression
    844845                                addAnonConversions( newCand );
    845                                 candidates.emplace_back( std::move( newCand ) );
     846                                candidates.emplace_back( move( newCand ) );
    846847                        }
    847848                }
     
    901902                                                        const ast::EnumDecl * enumDecl = enumInst->base;
    902903                                                        if ( const ast::Type* enumType = enumDecl->base ) {
    903                                                                 // instance of enum (T) is a instance of type (T)
     904                                                                // instance of enum (T) is a instance of type (T) 
    904905                                                                funcFinder.otypeKeys.insert(Mangle::mangle(enumType, Mangle::NoGenericParams | Mangle::Type));
    905906                                                        } else {
     
    907908                                                                funcFinder.otypeKeys.insert(Mangle::mangle(enumDecl, Mangle::NoGenericParams | Mangle::Type));
    908909                                                        }
    909                                                 }
     910                                                } 
    910911                                                else funcFinder.otypeKeys.insert(Mangle::mangle(argType, Mangle::NoGenericParams | Mangle::Type));
    911912                                        }
     
    986987                                        funcE.emplace_back( *func, symtab );
    987988                                }
    988                                 argExpansions.emplace_front( std::move( funcE ) );
     989                                argExpansions.emplace_front( move( funcE ) );
    989990
    990991                                for ( const CandidateRef & op : opFinder ) {
     
    10301031                                if ( cvtCost != Cost::infinity ) {
    10311032                                        withFunc->cvtCost = cvtCost;
    1032                                         candidates.emplace_back( std::move( withFunc ) );
    1033                                 }
    1034                         }
    1035                         found = std::move( candidates );
     1033                                        candidates.emplace_back( move( withFunc ) );
     1034                                }
     1035                        }
     1036                        found = move( candidates );
    10361037
    10371038                        // use a new list so that candidates are not examined by addAnonConversions twice
     
    10901091                        assert( toType );
    10911092                        toType = resolveTypeof( toType, context );
     1093                        // toType = SymTab::validateType( castExpr->location, toType, symtab );
    10921094                        toType = adjustExprType( toType, tenv, symtab );
    10931095
     
    11311133                                        CandidateRef newCand = std::make_shared<Candidate>(
    11321134                                                restructureCast( cand->expr, toType, castExpr->isGenerated ),
    1133                                                 copy( cand->env ), std::move( open ), std::move( need ), cand->cost,
     1135                                                copy( cand->env ), move( open ), move( need ), cand->cost,
    11341136                                                cand->cost + thisCost );
    11351137                                        inferParameters( newCand, matches );
     
    12851287                                // as a name expression
    12861288                                addAnonConversions( newCand );
    1287                                 candidates.emplace_back( std::move( newCand ) );
     1289                                candidates.emplace_back( move( newCand ) );
    12881290                        }
    12891291                }
     
    13941396                                                new ast::LogicalExpr{
    13951397                                                        logicalExpr->location, r1->expr, r2->expr, logicalExpr->isAnd },
    1396                                                 std::move( env ), std::move( open ), std::move( need ), r1->cost + r2->cost );
     1398                                                move( env ), move( open ), move( need ), r1->cost + r2->cost );
    13971399                                }
    13981400                        }
     
    14521454                                                        // output candidate
    14531455                                                        CandidateRef newCand = std::make_shared<Candidate>(
    1454                                                                 newExpr, std::move( env ), std::move( open ), std::move( need ), cost );
     1456                                                                newExpr, move( env ), move( open ), move( need ), cost );
    14551457                                                        inferParameters( newCand, candidates );
    14561458                                                }
     
    15191521                                                // add candidate
    15201522                                                CandidateRef newCand = std::make_shared<Candidate>(
    1521                                                         newExpr, std::move( env ), std::move( open ), std::move( need ),
     1523                                                        newExpr, move( env ), move( open ), move( need ),
    15221524                                                        r1->cost + r2->cost );
    15231525                                                inferParameters( newCand, candidates );
     
    15481550
    15491551                                addCandidate(
    1550                                         new ast::TupleExpr{ tupleExpr->location, std::move( exprs ) },
    1551                                         std::move( env ), std::move( open ), std::move( need ), sumCost( subs ) );
     1552                                        new ast::TupleExpr{ tupleExpr->location, move( exprs ) },
     1553                                        move( env ), move( open ), move( need ), sumCost( subs ) );
    15521554                        }
    15531555                }
     
    15881590                                // calculate target type
    15891591                                const ast::Type * toType = resolveTypeof( initAlt.type, context );
     1592                                // toType = SymTab::validateType( initExpr->location, toType, symtab );
    15901593                                toType = adjustExprType( toType, tenv, symtab );
    15911594                                // The call to find must occur inside this loop, otherwise polymorphic return
     
    16351638                                                                initExpr->location, restructureCast( cand->expr, toType ),
    16361639                                                                initAlt.designation },
    1637                                                         std::move(env), std::move( open ), std::move( need ), cand->cost, thisCost );
     1640                                                        move(env), move( open ), move( need ), cand->cost, thisCost );
    16381641                                                inferParameters( newCand, matches );
    16391642                                        }
     
    17681771                cand->env.applyFree( newResult );
    17691772                cand->expr = ast::mutate_field(
    1770                         cand->expr.get(), &ast::Expr::result, std::move( newResult ) );
     1773                        cand->expr.get(), &ast::Expr::result, move( newResult ) );
    17711774
    17721775                out.emplace_back( cand );
     
    18541857
    18551858                auto oldsize = candidates.size();
    1856                 candidates = std::move( pruned );
     1859                candidates = move( pruned );
    18571860
    18581861                PRINT(
Note: See TracChangeset for help on using the changeset viewer.