Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CandidateFinder.cpp

    r2f31773 r06ecda9  
    12411241                Cost minCastCost = Cost::infinity;
    12421242                for ( CandidateRef & cand : finder.candidates ) {
    1243                         ast::ptr< ast::Type > fromType = cand->expr->result;
    1244                         assert( fromType );
    1245                         fromType = resolveTypeof( fromType, context );
    1246                         fromType = adjustExprType( fromType, tenv, symtab );
    1247 
    12481243                        ast::AssertionSet need( cand->need.begin(), cand->need.end() ), have;
    12491244                        ast::OpenVarSet open( cand->open );
     
    12551250                        // subexpression results that are cast directly. The candidate is invalid if it
    12561251                        // has fewer results than there are types to cast to.
    1257                         int discardedValues = fromType->size() - toType->size();
     1252                        int discardedValues = cand->expr->result->size() - toType->size();
    12581253                        if ( discardedValues < 0 ) continue;
    12591254
    12601255                        // unification run for side-effects
    1261                         unify( toType, fromType, cand->env, need, have, open );
     1256                        unify( toType, cand->expr->result, cand->env, need, have, open );
    12621257                        Cost thisCost =
    12631258                                (castExpr->isGenerated == ast::GeneratedFlag::GeneratedCast)
    1264                                         ? conversionCost( fromType, toType, cand->expr->get_lvalue(), symtab, cand->env )
    1265                                         : castCost( fromType, toType, cand->expr->get_lvalue(), symtab, cand->env );
     1259                                        ? conversionCost( cand->expr->result, toType, cand->expr->get_lvalue(), symtab, cand->env )
     1260                                        : castCost( cand->expr->result, toType, cand->expr->get_lvalue(), symtab, cand->env );
    12661261                       
    12671262                        // Redefine enum cast
    1268                         auto argAsEnum = fromType.as<ast::EnumInstType>();
     1263                        auto argAsEnum = cand->expr->result.as<ast::EnumInstType>();
    12691264                        auto toAsEnum = toType.as<ast::EnumInstType>();
    12701265                        if ( argAsEnum && toAsEnum && argAsEnum->name != toAsEnum->name ) {
     
    12771272                        PRINT(
    12781273                                std::cerr << "working on cast with result: " << toType << std::endl;
    1279                                 std::cerr << "and expr type: " << fromType << std::endl;
     1274                                std::cerr << "and expr type: " << cand->expr->result << std::endl;
    12801275                                std::cerr << "env: " << cand->env << std::endl;
    12811276                        )
     
    12861281                                // count one safe conversion for each value that is thrown away
    12871282                                thisCost.incSafe( discardedValues );
    1288 
    1289                                 // See Aaron Moss, page 47; this reasoning does not hold since implicit conversions
    1290                                 // can create the same resolution issue. The C intrinsic interpretations are pruned
    1291                                 // immediately for the lowest cost option regardless of result type. Related code in
    1292                                 // postvisit (UntypedExpr).
    1293                                 // Cast expression costs are updated now to use the general rules.
    1294                                 /*
    12951283                                // select first on argument cost, then conversion cost
    12961284                                if ( cand->cost < minExprCost || ( cand->cost == minExprCost && thisCost < minCastCost ) ) {
     
    13011289                                // ambigious case, still output candidates to print in error message
    13021290                                if ( cand->cost == minExprCost && thisCost == minCastCost ) {
    1303                                 */
    1304                                 cand->cost += thisCost;
    1305                                 if (cand->cost < minExprCost) {
    1306                                         minExprCost = cand->cost;
    1307                                         matches.clear();
    1308                                 }
    1309                                 if (cand->cost == minExprCost) {
    13101291                                        CandidateRef newCand = std::make_shared<Candidate>(
    13111292                                                restructureCast( cand->expr, toType, castExpr->isGenerated ),
    1312                                                 copy( cand->env ), std::move( open ), std::move( need ), cand->cost);
     1293                                                copy( cand->env ), std::move( open ), std::move( need ), cand->cost + thisCost);
    13131294                                        // currently assertions are always resolved immediately so this should have no effect.
    13141295                                        // if this somehow changes in the future (e.g. delayed by indeterminate return type)
Note: See TracChangeset for help on using the changeset viewer.