- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r954ef5b rb0837e4 122 122 ) 123 123 mapPlace->second.isAmbiguous = true; 124 } else { 125 PRINT( 126 std::cerr << "cost " << candidate->cost << " loses to " << mapPlace->second.candidate->cost << std::endl; 127 ) 124 128 } 125 129 } else { … … 127 131 } 128 132 } 129 130 PRINT(131 std::cerr << "there are " << selected.size() << " alternatives before elimination" << std::endl;132 )133 133 134 134 // accept the alternatives that were unambiguous … … 181 181 } 182 182 if ( prune ) { 183 auto oldsize = alternatives.size(); 183 184 PRINT( 184 185 std::cerr << "alternatives before prune:" << std::endl; … … 198 199 } 199 200 alternatives.erase( oldBegin, alternatives.end() ); 201 PRINT( 202 std::cerr << "there are " << oldsize << " alternatives before elimination" << std::endl; 203 ) 200 204 PRINT( 201 205 std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; … … 319 323 Cost computeExpressionConversionCost( Expression *& actualExpr, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 320 324 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. 326 329 Cost tmpCost = convCost; 327 330 tmpCost.incPoly( -tmpCost.get_polyCost() ); 328 331 if ( tmpCost != Cost::zero ) { 332 // if ( convCost != Cost::zero ) { 329 333 Type *newType = formalType->clone(); 330 334 env.apply( newType ); … … 632 636 std::cerr << std::endl; 633 637 ) 634 ApplicationExpr *appExpr = static_cast< ApplicationExpr* >( newerAlt.expr );635 638 // 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(); 637 640 for ( UniqueId id : cur->second.idChain ) { 638 641 inferParameters = (*inferParameters)[ id ].inferParams.get(); … … 681 684 OpenVarSet openVars; 682 685 AssertionSet resultNeed, resultHave; 683 TypeEnvironment resultEnv ;686 TypeEnvironment resultEnv( func.env ); 684 687 makeUnifiableVars( funcType, openVars, resultNeed ); 685 688 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 … … 915 918 thisCost.incSafe( discardedValues ); 916 919 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 ) ); 922 921 } // if 923 922 } // for … … 1298 1297 // count one safe conversion for each value that is thrown away 1299 1298 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 ) ); 1301 1301 } 1302 1302 }
Note:
See TracChangeset
for help on using the changeset viewer.