Changeset 5b643ea for src/ResolvExpr


Ignore:
Timestamp:
Aug 16, 2024, 12:06:25 PM (17 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
afb15cf
Parents:
cef5bfc (diff), 8da3cc4d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CandidateFinder.cpp

    rcef5bfc r5b643ea  
    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
    12431248                        ast::AssertionSet need( cand->need.begin(), cand->need.end() ), have;
    12441249                        ast::OpenVarSet open( cand->open );
     
    12501255                        // subexpression results that are cast directly. The candidate is invalid if it
    12511256                        // has fewer results than there are types to cast to.
    1252                         int discardedValues = cand->expr->result->size() - toType->size();
     1257                        int discardedValues = fromType->size() - toType->size();
    12531258                        if ( discardedValues < 0 ) continue;
    12541259
    12551260                        // unification run for side-effects
    1256                         unify( toType, cand->expr->result, cand->env, need, have, open );
     1261                        unify( toType, fromType, cand->env, need, have, open );
    12571262                        Cost thisCost =
    12581263                                (castExpr->isGenerated == ast::GeneratedFlag::GeneratedCast)
    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 );
     1264                                        ? conversionCost( fromType, toType, cand->expr->get_lvalue(), symtab, cand->env )
     1265                                        : castCost( fromType, toType, cand->expr->get_lvalue(), symtab, cand->env );
    12611266                       
    12621267                        // Redefine enum cast
    1263                         auto argAsEnum = cand->expr->result.as<ast::EnumInstType>();
     1268                        auto argAsEnum = fromType.as<ast::EnumInstType>();
    12641269                        auto toAsEnum = toType.as<ast::EnumInstType>();
    12651270                        if ( argAsEnum && toAsEnum && argAsEnum->name != toAsEnum->name ) {
     
    12721277                        PRINT(
    12731278                                std::cerr << "working on cast with result: " << toType << std::endl;
    1274                                 std::cerr << "and expr type: " << cand->expr->result << std::endl;
     1279                                std::cerr << "and expr type: " << fromType << std::endl;
    12751280                                std::cerr << "env: " << cand->env << std::endl;
    12761281                        )
     
    12811286                                // count one safe conversion for each value that is thrown away
    12821287                                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                                /*
    12831295                                // select first on argument cost, then conversion cost
    12841296                                if ( cand->cost < minExprCost || ( cand->cost == minExprCost && thisCost < minCastCost ) ) {
     
    12891301                                // ambigious case, still output candidates to print in error message
    12901302                                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) {
    12911310                                        CandidateRef newCand = std::make_shared<Candidate>(
    12921311                                                restructureCast( cand->expr, toType, castExpr->isGenerated ),
    1293                                                 copy( cand->env ), std::move( open ), std::move( need ), cand->cost + thisCost);
     1312                                                copy( cand->env ), std::move( open ), std::move( need ), cand->cost);
    12941313                                        // currently assertions are always resolved immediately so this should have no effect.
    12951314                                        // if this somehow changes in the future (e.g. delayed by indeterminate return type)
Note: See TracChangeset for help on using the changeset viewer.