Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    rb0837e4 r6137fbb  
    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                                                 )
    128124                                        }
    129125                                } else {
     
    131127                                }
    132128                        }
     129
     130                        PRINT(
     131                                std::cerr << "there are " << selected.size() << " alternatives before elimination" << std::endl;
     132                        )
    133133
    134134                        // accept the alternatives that were unambiguous
     
    180180                        throw SemanticError( "No reasonable alternatives for expression ", expr );
    181181                }
     182                for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) {
     183                        if ( adjust ) {
     184                                adjustExprType( i->expr->get_result(), i->env, indexer );
     185                        }
     186                }
    182187                if ( prune ) {
    183                         auto oldsize = alternatives.size();
    184188                        PRINT(
    185189                                std::cerr << "alternatives before prune:" << std::endl;
     
    200204                        alternatives.erase( oldBegin, alternatives.end() );
    201205                        PRINT(
    202                                 std::cerr << "there are " << oldsize << " alternatives before elimination" << std::endl;
    203                         )
    204                         PRINT(
    205206                                std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl;
    206207                        )
    207                 }
    208                 // adjust types after pruning so that types substituted by pruneAlternatives are correctly adjusted
    209                 for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) {
    210                         if ( adjust ) {
    211                                 adjustExprType( i->expr->get_result(), i->env, indexer );
    212                         }
    213208                }
    214209
     
    323318        Cost computeExpressionConversionCost( Expression *& actualExpr, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) {
    324319                Cost convCost = computeConversionCost( actualExpr->result, formalType, indexer, env );
    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.
     320                // if ( convCost != Cost::zero ) {
     321
     322                // xxx - temporary -- ignore poly cost, since this causes some polymorphic functions to be cast, which causes the specialize
     323                // pass to try to specialize them, which currently does not work. Once that is fixed, remove the next 3 lines and uncomment the
     324                // previous line.
    329325                Cost tmpCost = convCost;
    330326                tmpCost.incPoly( -tmpCost.get_polyCost() );
    331327                if ( tmpCost != Cost::zero ) {
    332                 // if ( convCost != Cost::zero ) {
    333328                        Type *newType = formalType->clone();
    334329                        env.apply( newType );
     
    636631                                        std::cerr << std::endl;
    637632                                )
     633                                ApplicationExpr *appExpr = static_cast< ApplicationExpr* >( newerAlt.expr );
    638634                                // 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).
    639                                 InferredParams * inferParameters = &newerAlt.expr->get_inferParams();
     635                                InferredParams * inferParameters = &appExpr->get_inferParams();
    640636                                for ( UniqueId id : cur->second.idChain ) {
    641637                                        inferParameters = (*inferParameters)[ id ].inferParams.get();
     
    684680                OpenVarSet openVars;
    685681                AssertionSet resultNeed, resultHave;
    686                 TypeEnvironment resultEnv( func.env );
     682                TypeEnvironment resultEnv;
    687683                makeUnifiableVars( funcType, openVars, resultNeed );
    688684                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
     
    918914                                thisCost.incSafe( discardedValues );
    919915                                Alternative newAlt( restructureCast( i->expr->clone(), toType ), i->env, i->cost, thisCost );
    920                                 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) );
     916                                // xxx - this doesn't work at the moment, since inferParameters requires an ApplicationExpr as the alternative.
     917                                // Once this works, it should be possible to infer parameters on a cast expression and specialize any function.
     918
     919                                // inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) );
     920                                candidates.emplace_back( std::move( newAlt ) );
    921921                        } // if
    922922                } // for
     
    12971297                                        // count one safe conversion for each value that is thrown away
    12981298                                        thisCost.incSafe( discardedValues );
    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 ) );
     1299                                        candidates.push_back( Alternative( new InitExpr( restructureCast( alt.expr->clone(), toType ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost ) );
    13011300                                }
    13021301                        }
Note: See TracChangeset for help on using the changeset viewer.