Changeset 4ee1efb for src/ResolvExpr/AlternativeFinder.cc
- Timestamp:
- Oct 26, 2017, 11:23:26 AM (7 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 136ccd7
- Parents:
- 0b9be4d (diff), 598f50e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - git-author:
- Rob Schluntz <rschlunt@…> (10/26/17 10:43:08)
- git-committer:
- Rob Schluntz <rschlunt@…> (10/26/17 11:23:26)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r0b9be4d r4ee1efb 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 ) { 188 183 PRINT( … … 206 201 std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; 207 202 ) 203 } 204 // adjust types after pruning so that types substituted by pruneAlternatives are correctly adjusted 205 for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) { 206 if ( adjust ) { 207 adjustExprType( i->expr->get_result(), i->env, indexer ); 208 } 208 209 } 209 210 … … 318 319 Cost computeExpressionConversionCost( Expression *& actualExpr, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 319 320 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. 321 322 // if there is a non-zero conversion cost, ignoring poly cost, then the expression requires conversion. 323 // ignore poly cost for now, since this requires resolution of the cast to infer parameters and this 324 // does not currently work for the reason stated below. 325 325 Cost tmpCost = convCost; 326 326 tmpCost.incPoly( -tmpCost.get_polyCost() ); 327 327 if ( tmpCost != Cost::zero ) { 328 // if ( convCost != Cost::zero ) { 328 329 Type *newType = formalType->clone(); 329 330 env.apply( newType ); … … 631 632 std::cerr << std::endl; 632 633 ) 633 ApplicationExpr *appExpr = static_cast< ApplicationExpr* >( newerAlt.expr );634 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). 635 InferredParams * inferParameters = & appExpr->get_inferParams();635 InferredParams * inferParameters = &newerAlt.expr->get_inferParams(); 636 636 for ( UniqueId id : cur->second.idChain ) { 637 637 inferParameters = (*inferParameters)[ id ].inferParams.get(); … … 680 680 OpenVarSet openVars; 681 681 AssertionSet resultNeed, resultHave; 682 TypeEnvironment resultEnv ;682 TypeEnvironment resultEnv( func.env ); 683 683 makeUnifiableVars( funcType, openVars, resultNeed ); 684 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 … … 914 914 thisCost.incSafe( discardedValues ); 915 915 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 ) ); 916 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) ); 921 917 } // if 922 918 } // for … … 1297 1293 // count one safe conversion for each value that is thrown away 1298 1294 thisCost.incSafe( discardedValues ); 1299 candidates.push_back( Alternative( new InitExpr( restructureCast( alt.expr->clone(), toType ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost ) ); 1295 Alternative newAlt( new InitExpr( restructureCast( alt.expr->clone(), toType ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost ); 1296 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) ); 1300 1297 } 1301 1298 }
Note: See TracChangeset
for help on using the changeset viewer.