- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
rb0837e4 r6137fbb 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 )128 124 } 129 125 } else { … … 131 127 } 132 128 } 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 … … 180 180 throw SemanticError( "No reasonable alternatives for expression ", expr ); 181 181 } 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 } 182 187 if ( prune ) { 183 auto oldsize = alternatives.size();184 188 PRINT( 185 189 std::cerr << "alternatives before prune:" << std::endl; … … 200 204 alternatives.erase( oldBegin, alternatives.end() ); 201 205 PRINT( 202 std::cerr << "there are " << oldsize << " alternatives before elimination" << std::endl;203 )204 PRINT(205 206 std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; 206 207 ) 207 }208 // adjust types after pruning so that types substituted by pruneAlternatives are correctly adjusted209 for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) {210 if ( adjust ) {211 adjustExprType( i->expr->get_result(), i->env, indexer );212 }213 208 } 214 209 … … 323 318 Cost computeExpressionConversionCost( Expression *& actualExpr, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 324 319 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. 329 325 Cost tmpCost = convCost; 330 326 tmpCost.incPoly( -tmpCost.get_polyCost() ); 331 327 if ( tmpCost != Cost::zero ) { 332 // if ( convCost != Cost::zero ) {333 328 Type *newType = formalType->clone(); 334 329 env.apply( newType ); … … 636 631 std::cerr << std::endl; 637 632 ) 633 ApplicationExpr *appExpr = static_cast< ApplicationExpr* >( newerAlt.expr ); 638 634 // 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(); 640 636 for ( UniqueId id : cur->second.idChain ) { 641 637 inferParameters = (*inferParameters)[ id ].inferParams.get(); … … 684 680 OpenVarSet openVars; 685 681 AssertionSet resultNeed, resultHave; 686 TypeEnvironment resultEnv ( func.env );682 TypeEnvironment resultEnv; 687 683 makeUnifiableVars( funcType, openVars, resultNeed ); 688 684 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 … … 918 914 thisCost.incSafe( discardedValues ); 919 915 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 ) ); 921 921 } // if 922 922 } // for … … 1297 1297 // count one safe conversion for each value that is thrown away 1298 1298 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 ) ); 1301 1300 } 1302 1301 }
Note:
See TracChangeset
for help on using the changeset viewer.