Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    r954ef5b rb0837e4  
    122122                                                )
    123123                                                mapPlace->second.isAmbiguous = true;
     124                                        } else {
     125                                                PRINT(
     126                                                        std::cerr << "cost " << candidate->cost << " loses to " << mapPlace->second.candidate->cost << std::endl;
     127                                                )
    124128                                        }
    125129                                } else {
     
    127131                                }
    128132                        }
    129 
    130                         PRINT(
    131                                 std::cerr << "there are " << selected.size() << " alternatives before elimination" << std::endl;
    132                         )
    133133
    134134                        // accept the alternatives that were unambiguous
     
    181181                }
    182182                if ( prune ) {
     183                        auto oldsize = alternatives.size();
    183184                        PRINT(
    184185                                std::cerr << "alternatives before prune:" << std::endl;
     
    198199                        }
    199200                        alternatives.erase( oldBegin, alternatives.end() );
     201                        PRINT(
     202                                std::cerr << "there are " << oldsize << " alternatives before elimination" << std::endl;
     203                        )
    200204                        PRINT(
    201205                                std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl;
     
    319323        Cost computeExpressionConversionCost( Expression *& actualExpr, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) {
    320324                Cost convCost = computeConversionCost( actualExpr->result, formalType, indexer, env );
    321                 // if ( convCost != Cost::zero ) {
    322 
    323                 // xxx - temporary -- ignore poly cost, since this causes some polymorphic functions to be cast, which causes the specialize
    324                 // pass to try to specialize them, which currently does not work. Once that is fixed, remove the next 3 lines and uncomment the
    325                 // previous line.
     325
     326                // if there is a non-zero conversion cost, ignoring poly cost, then the expression requires conversion.
     327                // ignore poly cost for now, since this requires resolution of the cast to infer parameters and this
     328                // does not currently work for the reason stated below.
    326329                Cost tmpCost = convCost;
    327330                tmpCost.incPoly( -tmpCost.get_polyCost() );
    328331                if ( tmpCost != Cost::zero ) {
     332                // if ( convCost != Cost::zero ) {
    329333                        Type *newType = formalType->clone();
    330334                        env.apply( newType );
     
    632636                                        std::cerr << std::endl;
    633637                                )
    634                                 ApplicationExpr *appExpr = static_cast< ApplicationExpr* >( newerAlt.expr );
    635638                                // follow the current assertion's ID chain to find the correct set of inferred parameters to add the candidate to (i.e. the set of inferred parameters belonging to the entity which requested the assertion parameter).
    636                                 InferredParams * inferParameters = &appExpr->get_inferParams();
     639                                InferredParams * inferParameters = &newerAlt.expr->get_inferParams();
    637640                                for ( UniqueId id : cur->second.idChain ) {
    638641                                        inferParameters = (*inferParameters)[ id ].inferParams.get();
     
    681684                OpenVarSet openVars;
    682685                AssertionSet resultNeed, resultHave;
    683                 TypeEnvironment resultEnv;
     686                TypeEnvironment resultEnv( func.env );
    684687                makeUnifiableVars( funcType, openVars, resultNeed );
    685688                resultEnv.add( funcType->get_forall() ); // add all type variables as open variables now so that those not used in the parameter list are still considered open
     
    915918                                thisCost.incSafe( discardedValues );
    916919                                Alternative newAlt( restructureCast( i->expr->clone(), toType ), i->env, i->cost, thisCost );
    917                                 // xxx - this doesn't work at the moment, since inferParameters requires an ApplicationExpr as the alternative.
    918                                 // Once this works, it should be possible to infer parameters on a cast expression and specialize any function.
    919 
    920                                 // inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) );
    921                                 candidates.emplace_back( std::move( newAlt ) );
     920                                inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) );
    922921                        } // if
    923922                } // for
     
    12981297                                        // count one safe conversion for each value that is thrown away
    12991298                                        thisCost.incSafe( discardedValues );
    1300                                         candidates.push_back( Alternative( new InitExpr( restructureCast( alt.expr->clone(), toType ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost ) );
     1299                                        Alternative newAlt( new InitExpr( restructureCast( alt.expr->clone(), toType ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost );
     1300                                        inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) );
    13011301                                }
    13021302                        }
Note: See TracChangeset for help on using the changeset viewer.