- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r6137fbb 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 … … 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 }187 182 if ( prune ) { 183 auto oldsize = alternatives.size(); 188 184 PRINT( 189 185 std::cerr << "alternatives before prune:" << std::endl; … … 204 200 alternatives.erase( oldBegin, alternatives.end() ); 205 201 PRINT( 202 std::cerr << "there are " << oldsize << " alternatives before elimination" << std::endl; 203 ) 204 PRINT( 206 205 std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; 207 206 ) 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 } 208 213 } 209 214 … … 318 323 Cost computeExpressionConversionCost( Expression *& actualExpr, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 319 324 Cost convCost = computeConversionCost( actualExpr->result, formalType, indexer, env ); 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. 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. 325 329 Cost tmpCost = convCost; 326 330 tmpCost.incPoly( -tmpCost.get_polyCost() ); 327 331 if ( tmpCost != Cost::zero ) { 332 // if ( convCost != Cost::zero ) { 328 333 Type *newType = formalType->clone(); 329 334 env.apply( newType ); … … 631 636 std::cerr << std::endl; 632 637 ) 633 ApplicationExpr *appExpr = static_cast< ApplicationExpr* >( newerAlt.expr );634 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). 635 InferredParams * inferParameters = & appExpr->get_inferParams();639 InferredParams * inferParameters = &newerAlt.expr->get_inferParams(); 636 640 for ( UniqueId id : cur->second.idChain ) { 637 641 inferParameters = (*inferParameters)[ id ].inferParams.get(); … … 680 684 OpenVarSet openVars; 681 685 AssertionSet resultNeed, resultHave; 682 TypeEnvironment resultEnv ;686 TypeEnvironment resultEnv( func.env ); 683 687 makeUnifiableVars( funcType, openVars, resultNeed ); 684 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 … … 914 918 thisCost.incSafe( discardedValues ); 915 919 Alternative newAlt( restructureCast( i->expr->clone(), toType ), i->env, i->cost, thisCost ); 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 ) ); 920 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) ); 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 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 ) ); 1300 1301 } 1301 1302 }
Note:
See TracChangeset
for help on using the changeset viewer.